我正在尝试创建一个包含指向其自身实例的静态指针的类。这是一个例子:
A.H:
#include <iostream>
#ifndef _A_H
#define _A_H
class A {
static A * a;
};
A * a = NULL;
#endif
但是,当我将A.h包含在另一个文件中时,例如:
#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默认编译器。
答案 0 :(得分:5)
这一行:
A * a = NULL;
需要看起来像这样:
A *A::a = NULL;
您需要将其移出头文件,并将其放入源(.cpp)文件中。
静态成员的定义在程序中只能存在一次。如果将此行放在头文件中,它将包含在包含它的每个源文件中,从而导致重复的符号错误。
答案 1 :(得分:2)
因为a
和A.cpp
都定义了全局变量B.cpp
。一个公共符号只需要在一个地方定义。其余的人可以通过链接知道该符号的内容。
将A* a = NULL
行从A.h
移至A.cpp
。
(顺便说一句,要引用课程a
中的A
,请使用A* A::a = NULL;
,否则您将在全局命名空间中创建a
。)