Отсутствует конструктор по умолчанию — но я его не называю?

Я пишу приложение C ++, в котором у меня есть Controller класс с двумя вложенными структурами, определенными в моем заголовочном файле следующим образом:

class Controller {
struct help_message {   // controller.hpp, line 19
std::string summary;
std::string details;
help_message(const std::string&, const std::string&);
};

struct player_command {
cmd_t cmd;
help_message help;
// cmd_t is my own typedef, irrelevant for this question
player_command(const cmd_t&, const help_message&);
};

// more members...
};

В моем исходном файле у меня есть это:

Controller::player_command::player_command(const Controller::cmd_t& c, const help_message& h) {
cmd = c;
help = h;
};

Controller::help_message::help_message(const std::string& s, const std::string& d) {
summary = s;
details = d;
};

я думал, что это нормально, но когда я скомпилирую, получаю вот что (строка controller.cpp 12 — это первая строка исходного кода выше):

g++  -g -Wall -std=c++0x  -c -o controller.o controller.cpp
controller.cpp: In constructor ‘palla::Controller::player_command::player_command(void (palla::Controller::* const&)(const args_t&), const palla::Controller::help_message&)’:
controller.cpp:12:93: error: no matching function for call to ‘palla::Controller::help_message::help_message()’
controller.cpp:12:93: note: candidates are:
In file included from controller.cpp:7:0:
controller.hpp:22:3: note: palla::Controller::help_message::help_message(const string&, const string&)
controller.hpp:22:3: note:   candidate expects 2 arguments, 0 provided
controller.hpp:19:9: note: palla::Controller::help_message::help_message(const palla::Controller::help_message&)
controller.hpp:19:9: note:   candidate expects 1 argument, 0 provided
controller.hpp:19:9: note: palla::Controller::help_message::help_message(palla::Controller::help_message&&)
controller.hpp:19:9: note:   candidate expects 1 argument, 0 provided
make: *** [controller.o] Error 1

Из того, что я могу сделать вывод, компилятор пытается вызвать конструктор по умолчанию help_message, которого не существует Затем он пытается сопоставить вызов с созданным мною конструктором, а также с сгенерированным конструктором копирования и оператором присваивания, и в каждом из них происходит сбой по числу аргументов.

Но какая часть моего кода вызывает конструктор по умолчанию? И как мне исправить эту ошибку?

1

Решение

player_command() конструктор первых конструкций по умолчанию help а затем присваивает ему:

Controller::player_command::player_command(const Controller::cmd_t& c, const help_message& h) {
cmd = c;
help = h;
};

Измените это на:

Controller::player_command::player_command(const Controller::cmd_t& c, const help_message& h)
:  cmd(c),
help(h)
{
};

Увидеть Преимущества списков инициализации

7

Другие решения

player_command структура содержит help_message (помощь), и нет конструктора по умолчанию для help_message, Когда player_command вызывается конструктор, по умолчанию переменная-член справки будет создана по умолчанию. Вы немедленно назначаете справку для данного параметра, но это будет после того, как он будет создан по умолчанию. Вместо этого измените конструктор на что-то вроде:

Controller::player_command::player_command(const Controller::cmd_t& c, const help_message& h) : cmd(c), help(h)
{}

Это вызовет конструктор копирования для переменных cmd и help member вместо создания по умолчанию и последующего назначения.

3

Вы не используете синтаксис, который избегает конструктора копирования. Аргумент передается по ссылке (без конструктора копирования), но он действительно копируется при назначении в ivar.

Class::Class(const Variable &var) {
this->var = var; // assignment here, this invokes copy contructor!
}

Вы должны использовать следующий синтаксис:

Class::Class(const Variable &var) : var(var) { }
0
По вопросам рекламы [email protected]