这在c ++中是否正确

时间:2015-02-11 15:41:42

标签: c++ static-members

如果我在头文件中有以下代码是否正确?

template <T> Stopwatch *Stopwatch::m_instance = nullptr;
class Stopwatch
{
   std::clock_t m_lastStep;
   std::clock_t m_start;
   static Stopwatch *m_instance; 

};

ok在每个人的帮助下,我可以设法编译如下:

这个想法是在一个头文件上进行类定义和静态成员初始化。请注意,我使用模板但从未使用过它的类型。

为简单起见,我删除了其他部分代码。

template <typename T>
class Stopwatch
{
   std::clock_t m_lastStep;
   std::clock_t m_start;
   static Stopwatch *m_instance; 

};

template <typename T>
Stopwatch<T> *Stopwatch<T>::m_instance = nullptr;

现在我需要看看它是否真的有效!

2 个答案:

答案 0 :(得分:2)

为什么不编译才能看到?顺便说一下,代码无法编译。

  • 您必须在课程定义后移动第一行。

  • 此外,您将m_instance定义为两种不同的符号。您必须删除冗余模板说明符,或者在类定义中将m_instance成员变量声明为模板变量。

  • 如果您决定将其保留为模板变量,则模板参数T仍然缺少类型。在它之前添加typenameclass来解决此问题。

然后它将编译。

答案 1 :(得分:0)

如果只修改了一个* .cpp文件,那么只要将这个头文件包含在一个* .cpp文件中,就可以先修改类定义,这是正确的。

在头文件中实现静态字段(意思是:您可能会将其包含在多个* .cpp文件中): NOT POSSIBLE 。你甚至不能将它声明为静态。

我想原因是在C ++中你可能会通过函数调用的结果初始化变量,所以这会带来一个对象被双重初始化并导致未定义行为的风险(因为理论上它可能会模糊不清连接)。