我想要一个具有静态成员的类,但是我不知道如何做到这一点。这可能吗?
我知道错误:
只能在类内初始化静态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静态地访问它,而不需要在作用域中的某个地方声明它。这有可能吗?
发布于 2014-05-20 18:31:39
..。不需要在范围内的某个地方声明它。这有可能吗?
不,不声明它是不可能的(您已经尝试在类声明中这样做)。您可能是指,而不是在类声明之外定义它。答案也是否定的。
在这种情况下,您必须分离声明和定义(它只适用于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 );
}发布于 2014-05-20 18:26:58
..。不需要在范围内的某个地方声明它。这有可能吗?
不是的。
C++标准n3337 § 9.4.2/2
静态数据成员
静态数据成员在其类定义中的声明不是定义,可能是不完整的类型,而不是cv限定的void。静态数据成员的定义应出现在包含成员类定义的命名空间范围中。(...)
您可以在类中声明静态数据成员:
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静态数据成员为整型或枚举类型,则类定义中的声明可以指定一个大括号或相等的初始化器,其中作为赋值表达式的每个初始化子句都是一个常量表达式(.)
发布于 2014-05-20 18:27:04
对于非整型数据,这种方法是首选的,因为它避免了静态初始化失败。。
static const CData FIRST()
{
static CData first(512); //only initialized once, when first requested
return first;
}https://stackoverflow.com/questions/23767241
复制相似问题