【发布时间】:2011-12-03 12:03:47
【问题描述】:
我正在尝试:
class MyClass {
public:
MyClass();
int myID;
static int currentID;
};
MyClass::MyClass() {
myID = currentID;
++currentID;
}
我正在尝试为此类的所有实例分配一个唯一 ID。
编辑:
这对我不起作用。我在 xcode 中得到了其中两个:
未定义的符号: “GameObject::currentID”,引用自: __ZN10GameObject9currentIDE$non_lazy_ptr 在 GameObject.o (也许你的意思是:__ZN10GameObject9currentIDE$non_lazy_ptr) ld:未找到符号 collect2: ld 返回 1 个退出状态
【问题讨论】:
-
理想情况下,您应该查看使用 boost::once 的单例,以了解静态的无竞争初始化如何工作。您还应该使用 tbb::atomic
/ std::atomic 来防止竞争条件。这两项修改完成,您的代码现在是线程安全的。 -
运行时,是的。编译时,您需要在类范围之外(重新)定义
int MyClass::currentID。 -
@moshbear:从技术上讲,他需要定义他提供的是声明(即中的
re-(重新)define 不应该在那里) -
如果您计划在 STL 容器中使用 MyClass,请小心。代码的行为可能与您预期的不同。
-
@DavidRodríguez-dribeas 因此括号表示不确定性。我倾向于忘记声明和定义之间的区别。
标签: c++ static constructor