对在标头中声明并在cpp文件中实现的函数的未定义引用



我正在编写一些基本的C++代码,这些代码使用两个cpp文件(Main.cpp和CarbStore.cpp(和一个标头(CarbStore.h(。在我的标头中,我声明了一个稍后在CarbStore.chp中实现的函数。当我从Main.cpp调用该函数时,它会给我错误:

Main.cpp:17:对`CarbStore::CalcCarbs(unsigned char,unsigned char,unsignedchar,float,unsignated int,std::__cxx11::basic_string,std:::allocater>(const'的未定义引用

我的文件包含以下代码:

Main.cpp

#include <iostream>
#include <cstdint>
#include <cmath>
#include <ctime>
#include "CarbStore.h"

void CarbCalculator()
{
CarbStore carb;
carb.CalcCarbs(10, 11, 12, 0.1, 100, "test");
}
int main(int,char *[])
{
CarbCalculator();
std::cout << "Press enter to exit." << std::endl;
std::cin.get();
}

CarbStore.cpp

#include "CarbStore.h"
#include <iostream>
void CalcCarbs(unsigned char r, unsigned char b, unsigned char g, float bounciness, unsigned int price, std::string manufacturer)
{
//use values at later state
return;
}

CarbStore.h

#ifndef CARBSTORE_H
#define CARBSTORE_H
#include <vector>
class CarbStore
{
public:
void CalcCarbs(unsigned char r, unsigned char b, unsigned char g, float bounciness, unsigned int price, std::string manufacturer) const;
};

#endif

如评论中所述,以下

void CalcCarbs(unsigned char r, unsigned char b, unsigned char g, float bounciness, unsigned int price, std::string manufacturer)
{
//use values at later state
return;
}

不实现CarbStore的成员函数CalcCarbs,而是声明并定义了一个名为CalcCarbs的新自由函数。要实现成员函数,您需要告诉编译器函数定义应该属于哪个类。这是通过在函数名前面加上类名和一个双冒号来完成的:

void CarbStore::CalcCarbs(unsigned char r, unsigned char b, unsigned char g, float bounciness, unsigned int price, std::string manufacturer)
{
//use values at later state
return;
}

签名也必须匹配。在CarbStore中,您声明了函数const,但在实现中没有这样做。纠正:

void CarbStore::CalcCarbs(unsigned char r, unsigned char b, unsigned char g, float bounciness, unsigned int price, std::string manufacturer) const
{
//use values at later state
return;
}

然而,你不太可能真的想要一个返回为空的const成员函数,因为这样的函数只有通过修改全局变量或执行IO才能产生持久的效果

此外,但与此特定错误消息无关:

  1. CarbStore中,您使用的是std::string,因此需要#include<string>。另一方面,我在其中没有看到任何std::vector,所以#include<vector>似乎是不必要的(Main.cpp中除了iostream之外的所有其他包含也是如此(
  2. 在函数体末端的return;对于void函数也是无点的
  3. 如果main不使用命令行参数,也可以为其提供签名int main()

最新更新