2016-08-02 3 views
5

Мне нужно задержать вызов конструктора, поэтому я могу инициализировать значение, которое должно быть передано конструктору. Я написал короткий и очень упрощенный пример.Задержка конструктора вызова

class A 
{ 
private: 
    ObjectA* _ptr; 

public: 
    A(ObjectA*); 
}; 

class B 
{ 
private: 
    A object;  // The constructor seems to be called here? 
    ObjectA* obj; 

public: 
    B(); 
}; 

A::A(ObjectA* ptr) 
{ 
    this->_ptr = ptr; 
} 

B::B() 
{ 
    obj = new ObjectA(); 
    object(obj); // I want to call the 'A' constructor here, after initializing of 'obj'. 
} 

Возможно ли это?

+0

Создайте 'A' динамически в конструкторе' B' и сохраните указатель на него. – Ari0nhh

+3

Для C++ 17 используйте ['std :: optional'] (http://en.cppreference.com/w/cpp/utility/optional). Или просто улучшите свой дизайн. – StoryTeller

+0

Почему вы не можете просто отложить создание объекта до тех пор, пока значение, которое будет использоваться для его создания, не будет инициализировано? Это не так, как часто бывает разумно создавать объект, а затем использовать его, прежде чем он будет правильно инициализирован. – Peter

ответ

15

Нет, вы не можете отложить строительство элемента ценности. Вы можете использовать указатель вместо прямого значения, но это не решение вашей проблемы.

Правильное решение для вашей проблемы с помощью initialization list:

B::B () : obj(new ObjectA), object(obj) {} 

Кроме того, вы должны поставить obj перед тем object в class B:

class B 
{ 
     private: 
       ObjectA *obj; 
       A  object; 

     public: 
       B (); 
} 

Причина этого заключается в том, что, когда конструктор , все элементы объектов должны быть правильно построены и инициализированы. Это делается с использованием их конструктора по умолчанию.

Причина переупорядочения членов класса заключается в том, что инициализаторы членов вызываются в том порядке, в котором они объявлены в классе, не в порядке их появления в списке инициализации.

+1

Я бы настоятельно рекомендовал, чтобы OP использовал 'std :: unique_ptr'. Таким образом, ему не нужно беспокоиться об управлении памятью. –

+1

@MartinBonner, для 'obj', конечно, buf это другая тема. –