C ++ в основном избыточные стандартные и параметризованные конструкторы, нарушающие DRY

(используя 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.

Я мог бы просто использовать конструктор по умолчанию, а затем вручную изменить то, что мне нужно, но я хотел бы иметь один или несколько параметризованных конструкторов без повторения одних и тех же строк кода. Есть ли способ сделать это?

1

Решение

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

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*/}
3

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

Благодаря ответу @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);
}*/
}
0

По вопросам рекламы [email protected]