我想要一个具有私有静态数据成员的类(包含所有字符az的向量).在java或C#中,我可以创建一个"静态构造函数",它将在我创建类的任何实例之前运行,并设置类的静态数据成员.它只运行一次(因为变量是只读的,只需要设置一次),因为它是类的一个函数,它可以访问它的私有成员.我可以在构造函数中添加代码来检查向量是否已初始化,如果不是,则初始化它,但是这会引入许多必要的检查,并且似乎不是问题的最佳解决方案.
我想到,因为变量只是只读的,所以它们只能是公共的静态const,所以我可以在类外面设置它们,但是再一次,它看起来有点像丑陋的黑客.
如果我不想在实例构造函数中初始化它们,是否可以在类中拥有私有静态数据成员?
在C++中没有静态构造函数的基本原理是什么?
如果允许,我们将以非常有组织的方式在一个地方初始化其中的所有静态成员,如下所示:
//illegal C++
class sample
{
public:
static int some_integer;
static std::vector<std::string> strings;
//illegal constructor!
static sample()
{
some_integer = 100;
strings.push_back("stack");
strings.push_back("overflow");
}
};
Run Code Online (Sandbox Code Playgroud)
在静态构造函数的缺失中,很难有静态向量,并用值填充它,如上所示.静态构造函数优雅地解决了这个问题.我们可以以非常有组织的方式初始化静态成员.
那么为什么'C++没有静态构造函数?毕竟,其他语言(例如,C#)具有静态构造函数!
c++ language-features constructor language-design static-constructor
我最近读完了第一卷.Bruce Eckel在C++中的思考,现在转向将这些知识用于实际应用.
我最近使用静态成员函数并尝试使构造函数静态,编译器对此不满意.我检查了书中的原因但找不到任何原因.
有谁能解释为什么?
PS:在看到一些回复之后,我想提一下,由于我知道C#(和Java)允许构造函数被声明为静态,因此产生了混淆.
我正在考虑如何创建从模板基类派生的所有类的列表。
首先我想要一个模板基类:
template <typename T>
class Base
{
public:
Base() {};
virtual ~Base() {};
};
Run Code Online (Sandbox Code Playgroud)
以及一个继承自模板基类的类:
class Foo : public Base<Foo >
{
public:
Foo () {};
virtual ~Foo () {};
};
Run Code Online (Sandbox Code Playgroud)
可能还有任意数量的其他子类,例如Foo
. 结果应该看起来像这样:
std::vector<std::string> allTemplates = Base<Base>::getAllTemplateClasses();
Run Code Online (Sandbox Code Playgroud)
我的问题是是否可以在编译时创建所有子类的列表?魔术应该发生在基础班上,或者在儿童班上花费很少的努力。
我之前一直在思考不同的方向。首先我认为可以使用constexpr
. 就像每个子类都需要一个带有签名的静态函数:
constexpr static std::string name() { "Foo";}
Run Code Online (Sandbox Code Playgroud)
或者认为也许可以使用元编程并创建一个编译时列表,例如使用 Template-Meta 的编译时数据结构示例。这里的问题是我不知道模板创建的头部。
接下来我正在考虑使用宏并构建一个枚举结构,就像这样枚举结构扩展一样。所以我找不到解决这个问题的办法,我想问你是否有可能?
编辑:
说清楚:我想要一个子对象的列表,而不需要创建它们。
c++ ×4
constructor ×2
static ×2
compilation ×1
initializer ×1
oop ×1
private ×1
templates ×1
type-traits ×1