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

时间:2018-11-26 22:46:42

标签: c++ function linker-errors header-files

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

  

Main.cpp:17:对`CarbStore :: CalcCarbs的未定义引用(未签名的字符,未签名的字符,未签名的字符,浮点数,未签名的int,std :: __ cxx11 :: basic_string,std :: allocator>)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

1 个答案:

答案 0 :(得分:0)

如评论中所述,以下内容

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;
}

不实现CalcCarbs的成员函数CarbStore,而是声明并定义了一个新的自由函数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>似乎是不必要的(iostreamMain.cpp之外的所有其他内容也是如此)。
  2. 对于return;函数,函数主体末尾的void也毫无意义。
  3. 如果main不使用命令行参数,您也可以给它签名int main()