Может вызов конструктора другой конструктор в C++?

class A{
  A(int a = 5){
    DoSomething();
    A();
  }
  A(){...}
}

Может первый вызов конструктора второй?

36
задан Michael Krelin - hacker 13 December 2009 в 12:26
поделиться

4 ответа

Не до C ++ 11 .

Вместо этого выделите общие функции в отдельную функцию. Я обычно называю эту функцию construct () .

«Так называемый» второй вызов будет компилироваться, но в C ++ имеет другое значение: он создает новый объект, временный, который затем будет сразу удаляться в конце выписки. Итак, нет.

Деструктор, однако, можно вызвать без проблем.

63
ответ дан 27 November 2019 в 05:28
поделиться

Не раньше C ++ 0x , №

НО, просто из академического интереса Я придумал ужасный способ * сделать это с помощью оператора размещения "new" (кто-нибудь может указать, насколько это переносимо?)

#include <new>
#include <iostream>

class A
{
public:
    A(int i, int j)
        : i_(i), j_(j) { }

    A(int i)
    { new (this) A(i, 13); }

    int i_,j_;
};

int
main() {
    A a1(10,11), a2(10);
    std::cout
        << a1.i_ << ", "
        << a1.j_ << std::endl
        << a2.i_ << ", "
        << a2.j_ << std::endl;
    return 0;
}

* Черт, нет, я не пишу это в производственном коде.

16
ответ дан 27 November 2019 в 05:28
поделиться

Фактически ответ - «да», но, как предполагали другие, он не делает того, что вы хотите. Вы, конечно, можете использовать конструктор базового класса неявно или явно:

struct B {
    B() {}
    B( int x ) {}
};

struct A : public B {
    A() {}    // calls B() implicitly
    A( int a, int b ) : B( b ) {} // calls B(int) explicitly
};
6
ответ дан 27 November 2019 в 05:28
поделиться

Не напрямую. Есть несколько способов обойти это.

Из списка инициализаторов конструктора вашего класса вы можете вызвать конструктор для любого базового класса и для всех переменных-членов.

Таким образом, вы можете провести рефакторинг своего класса и разбить его на несколько более мелких, чтобы решить проблему. Обычно выполняемый код может быть помещен в объект-член или, возможно, в базовый класс. Затем каждый из конструкторов основного класса просто должен решить, какой конструктор использовать для инициализации этого члена.

class B {
  B() {  }
  B(int b) { DoSomething(); }
}
class A{
  A(int a = 5) : b(a) { } // call B's constructor which does something
  A() : b() {} // call B's constructor which does nothing

  B b;
};
3
ответ дан 27 November 2019 в 05:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: