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) 文件中。

静态成员的定义在您的程序中只能存在一次。如果将此行放在头文件中,它将包含在包含它的每个源文件中,从而导致重复符号错误。

于 2010-04-25T08:40:41.640 回答
2

因为全局变量在和a中都定义了。一个公共符号只需要在一个地方定义。其余的可以通过链接知道那个符号的内容。A.cppB.cpp

A* a = NULL线从A.h移到A.cpp

(顺便说一句,要引用aclass 中的A,请使用A* A::a = NULL;,否则您将a在全局命名空间中创建一个。)

于 2010-04-25T08:41:13.483 回答