1

我正在尝试做一些我认为应该很容易的事情(作为 C++ 菜鸟):从另一个类中引用一个类。出于某种原因,我收到一个错误:

错误 6 错误 LNK2019:未解析的外部符号“public: float * __thiscall Foo::Test(void)”(?Test@Foo@@QAEPAMXZ) 在函数“void __cdecl Test(void)”(?Test@@YAXXZ) 中引用.obj

Foo.h

class Foo
{
public:
    Foo(void);
    ~Foo(void);
    float* Test();
};

Foo.cpp

#include "Foo.h"
float* Test()
{
    return new float[0];
}

酒吧.h

class Bar
{
public:
    Bar(void);
    ~Bar(void);
    void Test();
};

条形图.cpp

#include "Bar.h"
#include "Foo.h"
void Test()
{
    Foo* foo = new Foo();
    foo->Test();
}

为什么编译器不让我从Bar引用类Foo?我不知道这个错误是什么意思,也不知道如何调试它。

4

3 回答 3

5
#include "Foo.h"
float* Test()
{
    return new float[0];
}

应该:

#include "Foo.h"
float* Foo::Test()
{
    return new float[0];
}

您的版本只是定义了一个自由函数Test,与成员函数不同Foo::Test

一个Unresolved external symbol错误意味着编译器告诉你,你告诉我我会找到这个东西的定义,但是我看了看,在任何地方都找不到。从本质上讲,你对它撒了谎,它把你叫出来了。

另一个垃圾是调用约定(__cdecl, __thiscall)和损坏的(实际)函数名(?Test@@YAXXZ)。

于 2013-01-22T00:25:37.980 回答
3

您需要实现Foo::Foo(),Foo::~Foo()和类似的Bar. 此外,实施float* Test()

float* Foo::Test() { ... }

但是你真的应该避免将指向动态分配对象的指针返回给调用者。std::vector<float>例如,使用智能指针。

于 2013-01-22T00:26:01.280 回答
2

您没有实现成员函数,Foo而是实现了Bar独立测试函数。要在类外实现成员函数,您需要提供具有范围解析的类名。

更新:

Foo.cpp

float* Test()
{
  return new float[0];
}

float* Foo::Test()
{
  return new float[0];
}

条形图.cpp

void Test()
{
  Foo* foo = new Foo();
  foo->Test();
}   

到:

void Bar::Test()
{
   Foo* foo = new Foo();
   foo->Test();
}

~Foo(void)您还需要~Bar(void)实施

于 2013-01-22T00:27:25.257 回答