2015-11-18 7 views
0

Соответствующая часть моего кода выглядит следующим образом:Инициализация статического объекта класса, без нулевого аргумента конструктора C++

В foo.h:

namespace foo_ns { 
class Foo 
{ 
    static Class1 object1; 
}; 
} 

В foo.cpp

#include <foo.h> 
namespace foo_ns { 

Class1 Foo::object1(/*another object. Need to call copy constructor*/) 

} 

Здесь «другой объект» определен в main(). Кроме того, Class1 является частью большой библиотеки и не имеет конструкторов с нулевым аргументом, поэтому простое удаление скобок приводит к ошибке no matching function call во время компиляции. Из того, что я понимаю, статическая инициализация ДОЛЖНА выполняться вне любой функции.

Так ли это обходное решение для этого?

+0

Вам нужно сначала инициализировать статическую переменную без скобок или скобок. И затем назначьте ему объект, который вы хотите скопировать в основном. Извините за ответ, я не видел комментариев. – 101010

+1

Очень похожий вопрос: http://stackoverflow.com/questions/33572283/can-i-initialize-a-static-const-member-at-run-time-in-c. –

+0

Как я уже сказал, изначально я не использовал круглые скобки и получил вышеупомянутую ошибку. Использование инициализации скобок дает ошибку 'должно быть инициализировано конструктором, а не {...}', которому предшествует другая ошибка '' расширенные списки инициализаторов, доступные только с std = C++ 11' – Ali250

ответ

1

Конечно, если Class1 есть методы, которые можно использовать позже, то простое решение будет:

Class1 Foo::object1(some_rubbish); 

// in main 
object1 = Class1(the_real_initializer); 

Если Class1 не имеет оператор рабочего назначения, но это может быть безопасно уничтожен и воссозданный, вы можете написать в основном:

object1.~Class1(); 
new(&object1) Class1(the_real_initializer); 

хотя, если этот конструктор бросает то вам придется прервать программу.


Если это не представляется возможным, чтобы уничтожить Class1 правильно до конца программы, то вам придется отложить его инициализацию, например:

static std::unique_ptr<Class1> p_object1; 

, а затем в основном, когда вы будете готовы ,

p_object1.reset(new Class1(bla bla bla)); 

Таким образом, вы должны изменить любой другой код, который обращается object1. использовать p_object1-> вместо.

Смежные вопросы