C ++静态const类成员初始化

时间:2014-05-20 18:23:53

标签: c++

我希望有一个拥有静态成员的课程,但我无法知道如何做到这一点。这甚至可能吗?

我收到错误:

  

只能在类

中初始化静态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静态访问它,而无需在范围内的某处声明它。这有可能吗?

3 个答案:

答案 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;
}