将类静态成员定义放入cpp文件 - 技术限制?

时间:2010-08-04 20:10:53

标签: c++ static declaration

在C ++中编码时,我最喜欢的一个烦恼是在我的类中声明一些静态变量,然后查看有关未解析的静态变量的编译错误(在以前的时间里,我总是被吓到了,这是什么意思)。 / p>

我的意思是经典的例子:

Test.h

class Test
{
private:
  static int m_staticVar;
  int m_var;
}

Test.cpp的

int Test::m_staticVar;

这让我觉得更令人困惑的是这个定义的语法,你不能在这里使用'static'这个词(因为静态在cpp中使用时有不同的含义,叹息)所以你不知道(除了知识静态成员变量就像那样工作)为什么地球上有一些以这种方式定义的测试类的int以及为什么m_var不是。

根据您的知识/意见,为什么?我只能想到一个原因,那就是让连接器生活更轻松 - 也就是说你为什么不能使用非整数常量(SomeClass m_var = something)。但是我不喜欢弯曲语言功能的想法只是因为编译链的某些部分会很难吃掉它...

2 个答案:

答案 0 :(得分:6)

嗯,这就是它的工作方式。您只在.h文件中声明了静态成员。链接器需要能够在它链接在一起的目标文件中找到该静态成员的一个定义。您不能将该定义放在.h文件中,这将生成多个定义。

更新:C ++ 17可以使用inline variable解决此问题。

答案 1 :(得分:1)

首先,从编译器的角度来看,这是完全合理的。为什么冗余关键字不需要?

其次,我建议在C ++中使用静态成员。在每个人都跳之前,我会尝试解释。

好吧,你不会有任何公共静态数据成员(很少有用)。在任何情况下,大多数类都有自己的CPP文件。如果是这样,由于依赖性降低的原因,静态全局IMO优于私有静态成员。与非静态私有数据不同,静态私有数据不是接口的一部分,并且为什么h文件的用户必须重新编译,或者根本不会看到这些成员的原因很少。