2

それ自体のインスタンスへの静的ポインターを含むクラスを作成しようとしています。次に例を示します。

あ:

#include <iostream>

#ifndef _A_H
#define _A_H

class A {
 static A * a;
};

A * a = NULL;

#endif

ただし、Ah を別のファイルに含めると、次のようになります。

#include "A.h"

class B {

};

次のエラーが表示されます。

ld: duplicate symbol _a in /Users/helixed/Desktop/Example/build/Example.build/Debug/Example.build/Objects-normal/x86_64/B.o and /Users/helixed/Desktop/Example/build/Example.build/Debug/Examplebuild/Objects-normal/x86_64/A.o

Mac OS X Snow Leopard で Xcode のデフォルト コンパイラを使用しています。

4

2 に答える 2

5

この行:

A * a = NULL;

次のようにする必要があります。

A *A::a = NULL;

そして、それをヘッダー ファイルから移動し、ソース (.cpp) ファイルに配置する必要があります。

静的メンバーの定義は、プログラム内に 1 回だけ存在する必要があります。この行をヘッダー ファイルに配置すると、それを含むすべてのソース ファイルに含まれ、シンボルの重複エラーが発生します。

于 2010-04-25T08:40:41.640 に答える
2

グローバル変数aは と の両方で定義されてA.cppいるためB.cppです。1 つのパブリック シンボルを 1 か所で定義するだけで済みます。残りは、リンクすることでそのシンボルの内容を知ることができます。

A* a = NULL行を からA.hに移動しA.cppます。

(ところで、aクラスの を参照するにはA、 を使用します。それ以外の場合は、グローバル名前空間でA* A::a = NULL;を作成しています。)a

于 2010-04-25T08:41:13.483 に答える