1

私は簡単だと思っていた (C++ 初心者として) 何かをしようとしています: あるクラスを別のクラスから参照します。何らかの理由で、次のエラーが表示されます。

エラー 6 エラー LNK2019: 未解決の外部シンボル "public: float * __thiscall Foo::Test(void)" (?Test@Foo@@QAEPAMXZ) が関数 "void __cdecl Test(void)" で参照されています (?Test@@YAXXZ) Bar .obj

フー。

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を参照できないのはなぜですか? このエラーの意味も、デバッグ方法もわかりません。

4

3 に答える 3

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) です。

于 2013-01-22T00:25:37.980 に答える
3

を実装する必要がありFoo::Foo()Foo::~Foo()同様にBar. さらに、の実装float* Test()

float* Foo::Test() { ... }

ただし、動的に割り当てられたオブジェクトへのポインターを呼び出し元に返すことは絶対に控えてください。std::vector<float>たとえば、スマート ポインターを使用します。

于 2013-01-22T00:26:01.280 に答える
2

Fooandのメンバー関数を実装していませんでしBarたが、フリースタンドの Test 関数です。クラス外でメンバー関数を実装するには、クラス名にスコープ解決を指定する必要があります。

アップデート:

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)ます

于 2013-01-22T00:27:25.257 に答える