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文件中定义静态成员。我该怎么办?
答案 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文件而有所不同。