Я хочу инициализировать статическую переменную-член внутри конструктора конкретного экземпляра. Это плохая идея?Инициализировать статический член внутри конструктора экземпляра
Ситуация такова. У меня есть статическая переменная-член, которой должны делиться все экземпляры этого класса. Обычно я просто использую статический инициализатор. Но у меня нет необходимой информации, необходимой для создания статического объекта, пока не будет вызван конструктор. Но, конечно, я не хочу создавать новый объект каждый раз при вызове конструктора, поэтому я хочу сделать что-то вроде этого.
class Foo
{
static Bar * bar;
Foo(Xyz xyz);
};
Bar * Foo::bar = nullptr;
Foo::Foo(Xyz xyz)
{
if (Foo::bar == nullptr)
{
// initialize static bar
Foo::bar = new Bar(xyz);
}
}
Я знаю, конечно xyz
migth быть различными для разных вызовов конструктора Foo
. Для меня это не важно.
Это плохой дизайн программного обеспечения? Я чувствую себя немного странно, инициализируя статический объект внутри конструктора. Но это не отличается от шаблона дизайна синглтона. Так, может быть, все в порядке?
EDIT
Спасибо за комментарии, ребята. Кажется, люди не являются поклонниками этого дизайна. Я буду изменять его так, чтобы я создал Bar
один раз перед самым первым экземпляром Foo
и передал Bar *
в качестве параметра в конструкторе Foo
. У каждого Foo
будет указатель на Bar
, и я обязательно удостоверьтесь, что все Foo
s все указывают на то же самое Bar
. Это лучше?
Обратите внимание, что вы не будете делать инициализацию. Вы будете выполнять задание. – NathanOliver
Как вы получаете значение, которое должно использоваться для _initialization_? Доступен ли он только во время выполнения? Кстати, образец не будет компилироваться. –
Одиночная резьба выглядит нормально. Состояние многопоточной гонки. –