2016-08-02 94 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

在'B'构造函数中动态创建'A'并存储指向它的指针。 – 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) {} 

而且,你必须把objobjectclass B

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

     public: 
       B (); 
} 

这样做的原因是,当一个构造函数被调用时,所有的对象成员都必须正确构造和初始化。这是使用它们的默认构造函数完成的。

重新排序类成员的原因是成员的初始值设定项按照它们在类中声明的顺序调用,而不是按照其在初始化列表中出现的顺序调用。

+1

我强烈建议OP使用'std :: unique_ptr'。这样他不需要担心管理内存。 –

+1

@MartinBonner,当然,对于'obj',buf是一个不同的话题。 –