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

时间:2013-01-22 00:24:12

标签: c++ visual-studio-2012

我正在尝试做一些我认为应该很容易的事情(作为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 个答案:

答案 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)

您没有实现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)以及