Задержка конструктора в C ++ - PullRequest
2 голосов
/ 06 мая 2009

Я просматривал код, который выглядит следующим образом:

class A; // defined somewhere else, has both default constructor and A(int _int) defined
class B
{
public:
    B(); // empty
    A a;
};

int main()
{
     B* b;
     b = new B();
     b->a(myInt); // here, calling the A(int _int) constructor,
     //but default constructor should already have been called
}

Это работает? Вызов конкретного конструктора после того, как по умолчанию уже был вызван?

Ответы [ 4 ]

15 голосов
/ 06 мая 2009

Этот код не вызывает конструктор a. Звонит A::operator()(int).

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

2 голосов
/ 06 мая 2009

вы можете сделать другой конструктор в классе B

B (int _int): a (_int) {}

в том случае, когда вы пишете b = новый B (myInt);

Приведенный выше код не задержит ваш код конструктора класса A.

вам не нужно звонить b-> a (myInt)

1 голос
/ 06 мая 2009

Это не вызов конструктора, и этот ответ охватывает единственно возможное объяснение происходящего.

Единственный стандартный способ вызова конструктора на существующем объекте - использовать размещение new (после уничтожения предыдущего экземпляра):

void foo (A * a) {
  a->~A ();           // Destroy previous instance
  new (a) A(myInt);   // Construct new object in same location
} 
0 голосов
/ 06 мая 2009

Вы должны просто вызвать конструктор A (int) из конструктора B () или создать конструктор B (int), который также вызывает конструктор A (int).

Лучше всего иметь как: по умолчанию для установки int по умолчанию для A, так и для B (int) для инициализации A (int).

...