我希望有一个拥有静态成员的课程,但我无法知道如何做到这一点。这甚至可能吗?
我收到错误:
只能在类
中初始化静态const积分数据成员
代码:
namespace misc
{
class CData
{
public:
CData( ) { };
CData( int d );
CData& operator = ( const CData& d );
static const CData FIRST = CData( 512 ); //how?
private:
int data;
};
}
当我使用FIRST
时,我希望使用misc::CData::FIRST
静态访问它,而无需在范围内的某处声明它。这有可能吗?
答案 0 :(得分:3)
...无需在范围内的某处声明它。这有可能吗?
不,如果没有声明它(你已经在你的班级声明中尝试过),它是不可能的。你可能意味着,在你的类声明之外没有定义它。答案是否定的
您必须为此案例分隔声明和定义(它仅适用于int
之类的基本整数类型,以便在类声明中直接初始化它们。)
首先在类声明中有一个简单的声明(通常类似于CData.hpp
)
namespace misc {
class CData {
public:
CData( ) { };
CData( int d );
CData& operator = ( const CData& d );
static const CData& FIRST;
private:
int data;
};
}
然后在单独的编译单元(通常类似CData.cpp
)
namespace misc {
const CData& CData::FIRST = CData( 512 );
}
答案 1 :(得分:0)
...无需在范围内的某处声明它。是的 有可能吗?
没有
C ++标准版n3337 § 9.4.2 / 2
静态数据成员
在其类定义中声明静态数据成员不是 定义,除了cv-qualified之外,可能是不完整的类型 无效。静态数据成员的定义应出现在 命名空间范围包含成员的类定义。 (...)
您可以在类中声明静态数据成员:
namespace misc {
class CData {
public:
//...
static const CData FIRST; // declaration
//...
}
并在(确切地)其中一个.cpp文件中定义它:
namespace misc {
CData CData::FIRST = CData( 512 ); // definition
}
这是首选解决方案,但您需要在课程中使用此定义。你可以在类中定义成员,如果它是一个整数类型
C ++标准版n3337 § 9.4.2 / 3说
如果非易失性const静态数据成员是完整的或 枚举类型,它在类定义中的声明可以指定 一个括号或等于初始化器,其中每个初始化器子句都是 赋值表达式是一个常量表达式(...)
答案 2 :(得分:0)
对于非整数数据,这样的东西是首选,因为它避免了static initialization fiasco.
static const CData FIRST()
{
static CData first(512); //only initialized once, when first requested
return first;
}