2013-01-22 19 views
1

我试图做一些我认为应该很容易的事情(作为C++ noob):引用另一个类。出于某种原因,我得到一个错误:引用另一个类的“无法解析的外部符号”

Error 6 error LNK2019: unresolved external symbol "public: float * __thiscall Foo::Test(void)" ([email protected]@@QAEPAMXZ) referenced in function "void __cdecl Test(void)" ([email protected]@YAXXZ) Bar.obj

foo.h中

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

Foo.cpp中

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

Bar.h

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

Bar.cpp

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

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

回答

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)和损坏的(实际)函数名称([email protected]@YAXXZ)。

+0

啊,非常感谢! – McGarnagle

3

您需要实施Foo::Foo(),Foo::~Foo()Bar类似。此外,float* Test()实施应该是

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

但你真的应该从返回指向动态分配的对象给调用者不要。例如,使用智能指针(std::vector<float>)。

+0

感谢您的提示,我不知道智能指针。 – McGarnagle

2

您没有实现FooBar的成员函数,但是自由支架测试功能。要在类之外实现成员函数,您需要提供具有范围解析的类名称。

更新:

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)以及