猿问

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

我想要一个带有私有静态数据成员(包含所有字符az的向量)的类。在Java或C#中,我可以创建一个“静态构造函数”,该静态构造函数将在创建该类的任何实例之前运行,并设置该类的静态数据成员。它只运行一次(因为变量是只读的,只需要设置一次),并且由于它是类的函数,因此可以访问其私有成员。我可以在构造函数中添加代码,以检查向量是否已初始化,如果尚未初始化,则将其初始化,但这会引入许多必要的检查,而且似乎不是解决问题的最佳方法。

我想到,由于变量将是只读的,因此它们只能是公共静态const,因此我可以在类外设置它们一次,但是再一次,这看起来像是一个丑陋的hack。

如果我不想在实例构造函数中初始化私有静态数据成员,是否可以在类中拥有私有静态数据成员?


幕布斯6054654
浏览 580回答 3
3回答

慕码人8056858

要获得与静态构造函数等效的功能,您需要编写一个单独的普通类来保存静态数据,然后创建该普通类的静态实例。class StaticStuff{&nbsp; &nbsp; &nbsp;std::vector<char> letters_;public:&nbsp; &nbsp; &nbsp;StaticStuff()&nbsp; &nbsp; &nbsp;{&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;for (char c = 'a'; c <= 'z'; c++)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;letters_.push_back(c);&nbsp; &nbsp; &nbsp;}&nbsp; &nbsp; &nbsp;// provide some way to get at letters_};class Elsewhere{&nbsp; &nbsp; static StaticStuff staticStuff; // constructor runs once, single instance};

守着一只汪

好吧,你可以拥有class MyClass{&nbsp; &nbsp; public:&nbsp; &nbsp; &nbsp; &nbsp; static vector<char> a;&nbsp; &nbsp; &nbsp; &nbsp; static class _init&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _init() { for(char i='a'; i<='z'; i++) a.push_back(i); }&nbsp; &nbsp; &nbsp; &nbsp; } _initializer;};不要忘了(在.cpp中):vector<char> MyClass::a;MyClass::_init MyClass::_initializer;该程序仍将链接而没有第二行,但是将不执行初始化程序。

青春有我

C ++ 11解决方案从C ++ 11开始,您可以简单地使用lambda表达式初始化静态类成员。如果您需要在各个静态成员之间强加一个构造顺序,或者如果您具有静态成员,那么这甚至可以工作const。头文件:class MyClass {&nbsp; &nbsp; static const vector<char> letters;&nbsp; &nbsp; static const size_t letterCount;};源文件:// Initialize MyClass::letters by using a lambda expression.const vector<char> MyClass::letters = [] {&nbsp; &nbsp; vector<char> letters;&nbsp; &nbsp; for (char c = 'a'; c <= 'z'; c++)&nbsp; &nbsp; &nbsp; &nbsp; letters.push_back(c);&nbsp; &nbsp; 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();
随时随地看视频慕课网APP
我要回答