【发布时间】:2015-11-30 16:29:28
【问题描述】:
我有一个需要使用非默认构造函数构造的类的静态成员。代码是这样的:
class MyClass
{
public:
static void initialise(int arg1, int arg2)
{
static MyClass instance(arg1, arg2);
_instance = instance;
}
static MyClass& instance()
{
return _instance;
}
/* Other non-static functions used with the return of instance()... */
private:
MyClass(int arg1, int arg2)
: _arg1(arg1), _arg2(arg2) {}
static MyClass& _instance;
int _arg1, _arg2;
};
我这样做是因为在应用程序的生命周期内我需要一个类的实例,但是它需要使用只有在读取配置后才知道的参数来构造。 MyClass 的超类将调用 MyClass 中的覆盖,这取决于了解这些配置项。
我一直在尝试找到一种方法来声明一个静态 MyClass 成员,该成员最初只是一个占位符,以便以后可以构造它,但我的测试表明这似乎是不可能的。测试如下:
#include <cstdio>
class CNoDefCtor
{
public:
CNoDefCtor(int arg1)
: _arg1(arg1)
{
printf("%s\n", __func__);
}
virtual ~CNoDefCtor()
{
printf("%s\n", __func__);
}
static void Initialise(int arg1)
{
printf("%s\n", __func__);
CNoDefCtor _instance(arg1); /* Actually construct here?!? */
}
static CNoDefCtor& instance()
{
return _instance;
}
int Arg1()
{
return _arg1;
}
private:
int _arg1;
static CNoDefCtor _instance;
};
int main()
{
printf("%s\n", __func__);
CNoDefCtor ndc; /* Placeholder? */
ndc.Initialise(1);
printf("%d\n", ndc.Instance().Arg1());
printf("%s\n", __func__);
}
所以我想我的问题是:你如何声明但不构造静态成员?我认为如果它没有默认构造函数是可能的。
请告诉我我遗漏了一些简单的东西,并且有一种简单的方法可以做到这一点。
【问题讨论】:
-
为什么不将静态成员保留为指针(或 shared_ptr)?默认值为 NULL,create() 将调用 new...
-
既然你有一个
instance()函数,将实际对象设为instance()函数的静态变量会简单得多,而不是类的静态成员。 -
根据您要求的其他详细信息,我希望您希望唯一的构造函数是一个不执行任何操作的私有默认构造函数,然后使用非构造函数处理初始化。
标签: c++ static static-members