【问题标题】:C++ class static member initialisation [duplicate]C ++类静态成员初始化[重复]
【发布时间】:2013-12-23 19:32:04
【问题描述】:

我有以下代码:

class employee {
public:
    static int last_id;
    ...

};

 int main() {
    employee::last_id=0;
 }

当我尝试运行它时,它会给出以下错误:

Undefined symbols for architecture x86_64:
  "employee::last_id", referenced from:
      _main in chap7-F3IpS1.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
[Finished in 0.3s with exit code 1]

【问题讨论】:

  • 应该用谷歌搜索这个。我记得遇到了这个错误。当我用谷歌搜索时,前 10 个左右的结果指向 Stack Overflow。难怪我可以在不发布另一个副本的情况下解决这个问题。

标签: c++ oop static


【解决方案1】:
int employee::last_id=0;
int main() {
    [...]

}

【讨论】:

    【解决方案2】:

    您只声明了静态数据成员,但没有定义它。写在全局命名空间的 main 之前

    int employee ::last_id;
    

    虽然您可以明确指定初始化程序,但它将被初始化为零。

    【讨论】:

    • 如果这个数据成员是一个常量,那么它可以在类定义中被初始化。在这种情况下,它必须具有限定符 const。
    • @VladfromMoscov:几乎是对的。但是,类定义中某些静态x 的初始化不会将x 的声明转换为定义......对于普通的const 静态,如果地址仍然需要类外定义被显式或隐式地使用(将x 视为存储位置)。但是,在 C++11 中,可以将静态 x 声明为 constexpr,并在类定义中进行初始化,这样就足以满足任何用途。
    • 值得注意的是,对于类模板中的静态变量,单一定义规则(或者更确切地说,此豁免是 ODR 的一部分)有一项特殊豁免。这反过来又允许在头文件中定义任何类型的静态常量,而无需使用包装函数和引用。我曾经称其为“成语”,但在回答了许多自然而然的问题后,痛苦地清楚它绝对不是一个成语,并不为人所知,即使它只是普通的 C++ 规则(在一个环形交叉路口)时尚)。 ;-)
    猜你喜欢
    • 2013-07-12
    • 2015-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多