неопределенная ссылка на функцию, объявленную в заголовке и реализованную в файле cpp - PullRequest
0 голосов
/ 27 ноября 2018

Я работаю над базовым кодом C ++, который использует два файла cpp (Main.cpp и CarbStore.cpp) и один заголовок (CarbStore.h).В моем заголовке я объявил функцию, которая позже реализована в CarbStore.cpp.Когда я вызываю функцию из моего Main.cpp, она выдает мне ошибку:

Main.cpp: 17: неопределенная ссылка на `CarbStore :: CalcCarbs (unsigned char, unsigned char, unsigned char, float, unsigned 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 голосов
/ 27 ноября 2018

Как уже сказано в комментариях, следующий

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 с пустым возвратом, потому что такая функция может иметь длительный эффект только путем изменения глобальных переменных или выполнения ввода-вывода.

Более того, но не связано с этим конкретным сообщением об ошибке:

  1. В CarbStore вы используете std::string, поэтому вам нужно #include<string>.С другой стороны, я не вижу в нем std::vector, поэтому #include<vector> кажется ненужным (как и все остальные, кроме iostream в Main.cpp).
  2. return;в конце тела функции также указывается бессмысленно для функции void.
  3. Если main не использует аргументы командной строки, вы также можете дать ему подпись int main().
...