проблема с встроенной функцией - PullRequest
1 голос
/ 29 апреля 2011

привет, у меня есть встроенная функция, когда я пытаюсь протестировать этот класс с помощью google test, у меня появляется ошибка вроде:

 error LNK2019: unresolved external symbol "public: double __thiscall Math::returnPi(void)" (?returnPi@Math@@QAENXZ) referenced in function "private: virtual void __thiscall Speed_Math_Test::TestBody(void)" (?TestBody@Speed_Math_Test@@EAEXXZ)

например мой класс (файл заголовка)

class Math
{
public:
    Math(void);
    inline double returnPi();
    ~Math(void);
};

мой класс (файл cpp)

Math::Math(void)
{}
Math::~Math(void)
{}
double Math::returnPi()
{ return 3.14;}

test:

TEST(EQ, Math)
{
    Math *m=new Math();
    EXPECT_EQ(3.14,m->returnPi());
}

что мне нужно сделать?Я прочитал руководство, но не вижу, как я могу решить эту ошибку.

Ответы [ 2 ]

3 голосов
/ 29 апреля 2011

Встроенная функция должна быть в вашем заголовочном файле, а не в исходном, так что она может быть встроена вызывающими (у которых нет доступа к исходному файлу).

Более того, вы нене нужно указывать inline в объявлении класса, если вы даете определение функции.

Таким образом, ваш заголовок должен стать:

class Math
{
public:
    Math(void);
    double returnPi() { return 3.14; } // no need to specify inline here
    ~Math(void);
};

И удалить определение для returnPi()из вашего исходного файла.

Обратите внимание, что вы могли бы также сделать:

class Math
{
public:
    Math(void);
    double returnPi();
    ~Math(void);
};


inline double Math::returnPi() { return 3.14; } // inline is mandatory here to avoid respecting the "One Definition Rule"

Второе решение хорошо, если вы хотите отделить объявление класса от определения функции.

Также обратите внимание, что inline не гарантирует, что фактические вызовы функций будут встроены: единственное, что он обеспечивает, - это то, что вам не нужно соблюдать «одно правило определения»: функция inline должна иметьОдинаковое определение во всех единицах перевода.

0 голосов
/ 29 апреля 2011

Вы уверены, что компилируете CPP-файл класса как часть проекта? Это должно быть хорошо.

...