延迟构造函数调用

时间:2016-08-02 10:59:30

标签: c++ constructor

我需要延迟构造函数调用,因此我可以初始化应该传递给构造函数的值。我写了一个简短而简单的例子。

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'.
}

有可能吗?

2 个答案:

答案 0 :(得分:15)

不,您不能推迟构建值成员。您可以使用指针而不是直接值,但这不是您的问题的解决方案。

问题的正确解决方法是使用initialization list

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

此外,您必须在obj之前object放置class B

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

        public: 
                B ( );
}

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

重新排序类成员的原因是成员的初始化程序按照它们在类中声明的顺序调用,而不是按照它们在初始化列表中的外观顺序调用。

答案 1 :(得分:-1)

这是我要使用的解决方案。

class B
{
private:
  char m_aBytes[sizeof(A)];

  A& getA () { return *(A*)m_aBytes; }

public:
  B ()
  {
    ObjectA* objA = new ObjectA ();
    new (m_aBytes) (objA);
  }
}