我正在尝试做一些我认为应该很容易的事情(作为C ++ noob):从另一个类引用一个类。出于某种原因,我收到了一个错误:
错误6错误LNK2019:未解析的外部符号“public:float * __thiscall Foo :: Test(void)”(?Test @ Foo @@ QAEPAMXZ)在函数“void __cdecl Test(void)”中引用(?Test @@ 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();
}
为什么编译器不允许我从 Bar 引用 Foo 类?我不知道这个错误意味着什么,也不知道如何调试它。
答案 0 :(得分: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
)。
答案 1 :(得分:3)
您需要为Foo::Foo()
实施Foo::~Foo()
,Bar
和类似内容。此外,float* Test()
的实施应该是
float* Foo::Test() { ... }
但是你应该避免将指向动态分配对象的指针返回给调用者。使用std::vector<float>
的智能指针。
答案 2 :(得分:2)
您没有实现Foo
和Bar
的成员函数,而是免费使用测试功能。要在类外部实现成员函数,您需要提供具有范围分辨率的类名。
更新
Foo.cpp
float* Test()
{
return new float[0];
}
到
float* Foo::Test()
{
return new float[0];
}
Bar.cpp
void Test()
{
Foo* foo = new Foo();
foo->Test();
}
致:
void Bar::Test()
{
Foo* foo = new Foo();
foo->Test();
}
您还需要实施~Foo(void)
,~Bar(void)
以及