提问者:小点点

引用一个类与另一个类的“未解析外部符号”


我正在尝试做一些我认为应该很容易的事情(作为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? 我不知道这个错误意味着什么,也不知道如何调试它。


共3个答案

匿名用户

#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

匿名用户

您没有实现foobar的成员函数,而是实现了独立测试函数。 要在类外实现成员函数,需要提供具有作用域解析的类名。

更新:

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)