2013-01-22 17 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)以及