Объявление объекта-члена без вызова его конструктора по умолчанию - PullRequest
2 голосов
/ 03 ноября 2019

У меня есть два класса: Generator и Motor. Вот урезанная версия Generator:

class Generator {
private:
    Motor motor;    // this will be initialized later
                    // However, this line causes the constructor to run.
public: 
    Generator(string);
}

Generator::Generator(string filename) {
    motor = Motor(filename);     // initialisation here

}

, а вот определение класса Motor:

class Motor {
public:
    Motor();
    Motor(string filename);
}

Motor::Motor() {
    cout << "invalid empty constructor called" << endl;
}
Motor::Motor(string filename) {
    cout << "valid constructor called" << endl;
}

А вот моя main() функция:

int main(int argc, char* argv[]) {
    Generator generator = Generator(argv[1]);
    ....
    ....
}

Вывод:

недопустимый пустой конструктор с именем

допустимый конструктор с именем

Как определить класс Generator, чтобы иметьэкземпляр Motor без вызова пустого конструктора Motor, до тех пор, пока позже?

Мне пришлось включить пустой конструктор, потому что g++ отказывается компилироваться без него.

1 Ответ

5 голосов
/ 03 ноября 2019

Вам нужно использовать конструкцию списка в вашем Generator конструкторе:

Generator::Generator(string filename) : motor(filename) // initialization here
{
    // nothing needs to do be done here
}

Что на самом деле делает ваш исходный код:

Generator::Generator(string filename) /* : motor() */ // implicit empty initialization here
{
    motor = Motor(filename) // create a temp instance of Motor
    //    ^------------------- copy it into motor using the default operator=()
                            // destruct the temp instance of Motor
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...