数组大小的静态常量成员

时间:2011-10-10 08:09:54

标签: c++

MyClass.h

class MyClass
{
public:

static const int cTotalCars;

private:

int m_Cars[cTotalCars];
};

MyClass.cpp

#include "MyClass.h"
const int MyClass::cTotalCars = 5;

上面的代码不起作用,因为它会为m_Cars数组说“预期的常量表达式”。

class MyClass
{
public:

static const int cTotalCars = 5;

private:

int m_Cars[cTotalCars];
};

以上方法可行,但我被告知我应该始终在类定义之外的CPP文件中定义静态成员。我该怎么办?

5 个答案:

答案 0 :(得分:7)

简单类型的静态const成员是该规则的一个例外,因此后一个代码是正确的。

这个例外是一个相当现代的例子(来自C ++ 98,但几年后才由每个编译器实现),所以许多老式教师还没有意识到这一点。他们更喜欢这个成语:

class MyClass
{
public:
   enum { cTotalCars = 5 };

private:
    int m_Cars[cTotalCars];
};

表现完全相同,但现在没什么意义。

答案 1 :(得分:3)

  

以上方法可行,但我被告知我应该始终在类定义之外的CPP文件中定义静态成员。我该怎么办?

那么,建议您做什么:在CPP中定义静态成员。请注意,在上面的代码中,即使声明了值,静态成员也是。正确的最终代码如下:

// .h (ignoring all but the static member)
class MyClass {
   static const int cTotalCars = 5;        // declaration and initialization
};
// .cpp
static const int MyClass::cTotalCars;      // definition (cannot have value!)

.cpp文件中的定义是当用作左值时实际为变量保留空间的内容。对于一个简单的测试,验证没有该行的变量未定义,您可以这样做:

void f( const int & x ) {}
int main() {
   f( MyClass::cTotalCars );
}

如果没有.cpp文件中的行,上面的代码将触发指向MyClass::cTotalCars缺少定义的链接器错误。代码的问题在于它使用静态const成员(通过标准中 use 的定义),并且需要定义成员。虽然使用常量来定义数组大小的情况不构成 use

答案 2 :(得分:0)

我宁愿使用#define C_TOTAL_CARS 5,然后使用static const int cTotalCars = C_TOTAL_CARS;,然后使用int m_Cars[C_TOTAL_CARS];

答案 3 :(得分:0)

如果是static int,则需要将其放入.cpp文件中。在这个实例中,您不需要关键字static,因为您只需要一个常量。只需使用const int cTotalCars = 5;即可。它比#define好,因为你有类型信息,并且它有一个可以在调试器中查看的符号。

答案 4 :(得分:0)

如果定义数组的大小是在cpp文件中设置的,那么它就无法工作。所有类客户端都应该知道类实例的大小,但他们只是不知道.cpp文件,因为你只在客户端文件中放入#include“MyClass.h”。

换句话说 - 您的类定义会因编译使用MyClass的文件时未使用的cpp文件而有所不同。