【问题标题】:C++: static variables in the class to be included in multiple cpp files [duplicate]C ++:要包含在多个cpp文件中的类中的静态变量[重复]
【发布时间】:2013-08-30 05:11:51
【问题描述】:
// A.h
class A {
public:
  static int a;
};
int A::a = 0;

如果我尝试在多个 .cpp 文件中包含 A.h,链接将失败并显示 multiple definition of A::a。我认为这是有道理的,因为每个 .obj 文件都包含 A::a

但是,我可以使用模板,

// A.h
template<class T>
class A {
public:
  static T a;
};
template<class T>
T A<T>::a = 0;

我现在可以在多个 .cpp 文件中包含 A.h 并且我可以在一个 .cpp 文件中分配值 A&lt;int&gt;::a = 100; 并使用 A&lt;int&gt;::a 在另一个文件中获得相同的值。

  • 模板何时会产生如此大的影响?
  • 这个静态变量是否只有 1 个副本?哪个 .obj 会保留这个变量?
  • 构造函数是否只调用一次?如果初始值不同,哪一个胜出?

【问题讨论】:

标签: c++ compilation linker


【解决方案1】:

模板什么时候有这么大的区别?

总是。我想我不明白这个问题。

这个静态变量只有 1 个副本吗?

模板实例化时使用的每个不同类型T 在最终程序中只有一个副本。

哪个 .obj 会保留这个变量?

所有这些都是从实例化模板的翻译单元生成的。然后链接器选择一个并丢弃所有其他的。

构造函数是否只调用一次?

每个专业一次。

如果初始值不同,哪一个胜出?

这将违反单一定义规则。这样的程序格式不正确,不需要诊断。

【讨论】:

  • 我了解示例中的代码不符合最佳实践。但我试图了解链接如何与这样的代码一起使用。
【解决方案2】:

为什么不在实现class A 的源文件中定义静态成员?然后你应该能够在多个源文件中包含A.h 没有问题。

// A.h
class A {
public:
  static int a;
};

// A.cpp
int A::a = 0;

【讨论】:

  • -1。这不是问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-15
  • 1970-01-01
  • 2020-06-11
  • 1970-01-01
  • 2020-07-05
  • 2013-07-15
相关资源
最近更新 更多