C ++:类中的静态变量,包含在多个cpp文件中

时间:2013-08-30 05:11:51

标签: c++ compilation linker

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

如果我尝试将A.h包含在多个.cpp文件中,则链接将失败并显示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<int>::a = 100;,并在另一个A<int>::a中获取相同的值。< / p>

  • 模板何时产生这种差异?
  • 这个静态变量只有1个副本吗?哪个.obj会保留这个变量?
  • 构造函数只调用一次吗?如果初始值不同,哪一个胜出?

2 个答案:

答案 0 :(得分:1)

  

模板何时产生这种差异?

始终。我想我不明白这个问题。

  

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

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

  

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

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

  

构造函数只调用一次吗?

每次专业化一次。

  

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

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

答案 1 :(得分:-1)

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

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

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