У меня есть статический член класса, который нужно построить с использованием конструктора, отличного от стандартного. Код выглядит так:Построение статической переменной-члена поздно
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() вызовет новый ... – Shloim
Поскольку в любом случае у вас есть функция 'instance()', было бы намного проще сделать фактический объект статической переменной 'instance()' а не статический член класса. – JSF
В зависимости от других деталей ваших требований, я ожидаю, что вы хотите, чтобы единственный конструктор был частным конструктором по умолчанию, который ничего не делает, а затем обрабатывает инициализацию с помощью функции non constructor. – JSF