首页 文章

C静态const类成员初始化

提问于
浏览
1

我想有一个自己有静态成员的类,但我无法想象如何做到这一点 . 这甚至可能吗?

我收到错误:

只能在类中初始化静态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

    ...无需在范围内的某处声明它 . 这有可能吗?

    不,如果没有声明它(你已经尝试在你的类声明中做),它是不可能的 . 你可能意味着,没有在你的类声明之外定义它 . 答案是否定的 .
    你必须为这种情况分离声明和定义(它只适用于基本的整数类型,如 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 );
    }
    
  • 3

    对于非整数数据,这样的东西是首选的,因为它避免了static initialization fiasco.

    static const CData FIRST()
    {
        static CData first(512); //only initialized once, when first requested
    
        return first;
    }
    
  • 0

    ...无需在范围内的某处声明它 . 这有可能吗?

    没有 .

    C标准n3337 § 9.4.2 / 2

    静态数据成员

    在类定义中声明静态数据成员不是定义,除了cv-qualified 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静态数据成员具有整数或枚举类型,则其在类定义中的声明可以指定一个大括号或大小为初始化器,其中作为赋值表达式的每个initializer子句都是一个常量表达式( ...)

相关问题