为了账号安全,请及时绑定邮箱和手机立即绑定

C ++中的静态构造函数?我需要初始化私有静态对象

C ++中的静态构造函数?我需要初始化私有静态对象

C++
幕布斯6054654 2019-10-15 10:24:57
我想要一个带有私有静态数据成员(包含所有字符az的向量)的类。在Java或C#中,我可以创建一个“静态构造函数”,该静态构造函数将在创建该类的任何实例之前运行,并设置该类的静态数据成员。它只运行一次(因为变量是只读的,只需要设置一次),并且由于它是类的函数,因此可以访问其私有成员。我可以在构造函数中添加代码,以检查向量是否已初始化,如果尚未初始化,则将其初始化,但这会引入许多必要的检查,而且似乎不是解决问题的最佳方法。我想到,由于变量将是只读的,因此它们只能是公共静态const,因此我可以在类外设置它们一次,但是再一次,这看起来像是一个丑陋的hack。如果我不想在实例构造函数中初始化私有静态数据成员,是否可以在类中拥有私有静态数据成员?
查看完整描述

3 回答

?
慕码人8056858

TA贡献1803条经验 获得超6个赞

要获得与静态构造函数等效的功能,您需要编写一个单独的普通类来保存静态数据,然后创建该普通类的静态实例。


class StaticStuff

{

     std::vector<char> letters_;


public:

     StaticStuff()

     {

         for (char c = 'a'; c <= 'z'; c++)

             letters_.push_back(c);

     }


     // provide some way to get at letters_

};


class Elsewhere

{

    static StaticStuff staticStuff; // constructor runs once, single instance


};


查看完整回答
反对 回复 2019-10-15
?
守着一只汪

TA贡献1872条经验 获得超3个赞

好吧,你可以拥有


class MyClass

{

    public:

        static vector<char> a;


        static class _init

        {

          public:

            _init() { for(char i='a'; i<='z'; i++) a.push_back(i); }

        } _initializer;

};

不要忘了(在.cpp中):


vector<char> MyClass::a;

MyClass::_init MyClass::_initializer;

该程序仍将链接而没有第二行,但是将不执行初始化程序。


查看完整回答
反对 回复 2019-10-15
?
青春有我

TA贡献1784条经验 获得超8个赞

C ++ 11解决方案

从C ++ 11开始,您可以简单地使用lambda表达式初始化静态类成员。如果您需要在各个静态成员之间强加一个构造顺序,或者如果您具有静态成员,那么这甚至可以工作const。


头文件:


class MyClass {

    static const vector<char> letters;

    static const size_t letterCount;

};

源文件:


// Initialize MyClass::letters by using a lambda expression.

const vector<char> MyClass::letters = [] {

    vector<char> letters;

    for (char c = 'a'; c <= 'z'; c++)

        letters.push_back(c);

    return letters;

}();


// The initialization order of static members is defined by the order of

// definition within the source file, so we can access MyClass::letters here.

const size_t MyClass::letterCount = letters.size();


查看完整回答
反对 回复 2019-10-15
  • 3 回答
  • 0 关注
  • 579 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信