(используя C ++ в Visual Studio)
У меня есть следующий конструктор по умолчанию, используемый для создания объекта космического корабля:
Ship() // default constructor
{
name = "[ship unnamed]";
length = 1000;
width = 500;
power = 100;
vector<int> temp = { 100, 100 }; // { current health, maximum health}
bridge = temp;
sensor_arrays.push_back(temp); // 2 sensor arrays
sensor_arrays.push_back(temp);
for (int i = 0; i < 12; i++) // create 12 each
{
lasers.push_back(temp);
heavy_lasers.push_back(temp);
strike_fighters.push_back(temp);
strike_bombers.push_back(temp);
}
}
Затем у меня есть следующий параметризованный конструктор, используемый для создания корабля с именем:
Ship(string custom_name)
{
name = custom_name;
length = 1000;
width = 500;
power = 100;
vector<int> temp = { 100, 100 }; // { current health, maximum health}
bridge = temp;
sensor_arrays.push_back(temp); // 2 sensor arrays
sensor_arrays.push_back(temp);
for (int i = 0; i < 12; i++) // create 12 each
{
lasers.push_back(temp);
heavy_lasers.push_back(temp);
strike_fighters.push_back(temp);
strike_bombers.push_back(temp);
}
}
Изменена только одна строка, так что, похоже, это нарушает DRY.
Я мог бы просто использовать конструктор по умолчанию, а затем вручную изменить то, что мне нужно, но я хотел бы иметь один или несколько параметризованных конструкторов без повторения одних и тех же строк кода. Есть ли способ сделать это?
Вы можете использовать один из следующих:
explicit Ship(const std::string& custom_name = "[ship unnamed]") {/*your code*/}
или же
Ship() : Ship("[ship unnamed]") {} // delegate constructor, require C++11
explicit Ship(const std::string& custom_name) {/*your code*/}
Благодаря ответу @Chris я реализовал список инициализаторов, как описано Вот.
Решение: (оригинальный код под вопросом)
Ship(string custom_name) : Ship()
{
name = custom_name;
/*length = 1000;
width = 500;
power = 100;
vector<int> temp = { 100, 100 };
bridge = temp;
sensor_arrays.push_back(temp); // 2 sensor arrays
sensor_arrays.push_back(temp);
for (int i = 0; i < 12; i++) // create 12 each
{
lasers.push_back(temp);
heavy_lasers.push_back(temp);
strike_fighters.push_back(temp);
strike_bombers.push_back(temp);
}*/
}