我正在尝试做一些我认为应该很容易的事情(作为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? 我不知道这个错误意味着什么,也不知道如何调试它。
#include "Foo.h"
float* Test()
{
return new float[0];
}
应该是:
#include "Foo.h"
float* Foo::Test()
{
return new float[0];
}
您的版本只是定义了一个自由函数test
,与成员函数foo::test
不同。
一个未解析的外部符号
错误意味着编译器在告诉你嘿,你告诉我我会找到这个东西的定义,但是我看了看,到处都找不到。 本质上,你对它撒谎了,它把你叫出来了。
另一个垃圾是调用约定(__cdecl
,__thiscall
)和损坏的(实际)函数名(?test@@yaxxz
)。
您需要实现foo::foo()
,foo::~foo()
以及类似的bar
。 此外,float*Test()
的实现应该是
float* Foo::Test() { ... }
但是您确实应该避免将指向动态分配对象的指针返回给调用方。 使用智能指针,例如std::vector
。
您没有实现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)