Dav*_*mes 3 c++ oop design-patterns
Ship *ship;
if (newShipType == 0)
{
ship = new SmallShip(gridPosition.x, gridPosition.y,
grid->raw);
}
else if (newShipType == 1)
{
ship = new MediumShip(gridPosition.x, gridPosition.y,
grid->raw);
}
else // 2
{
ship = new BigShip(gridPosition.x, gridPosition.y,
grid->raw);
}
Run Code Online (Sandbox Code Playgroud)
我有这个代码,我希望通过以下方式简化:
Ship *ship = new getShipByType[newShipType](gridPosition.x, gridPosition.y, grid->raw);
Run Code Online (Sandbox Code Playgroud)
有可能吗?
Ship getShipByType[3] = {SmallShip, MediumShip, BigShip};
Run Code Online (Sandbox Code Playgroud)
这给了:
error: expected primary-expression before ‘,’ token
error: expected primary-expression before ‘,’ token
error: expected primary-expression before ‘}’ token
Run Code Online (Sandbox Code Playgroud)
我真的不希望它编译,只是寻找一种更简单的方法,这只是一个非常长的尝试.
您可以委派一个函数来创建不同的船只,它通常被称为工厂模式.数组也不处理多态,你需要使用vector代替:
#include <memory>
enum ShipType { Small = 0, Medium, Big };
std::unique_ptr<Ship> makeShip(ShipType ship_type, GridPosition position)
{
switch(ship_type)
{
case Small:
return std::unique_ptr<Ship>(new SmallShip());
break;
case Medium:
return std::unique_ptr<Ship>(new MediumShip());
case Big
return std::unique_ptr<Ship>(new BigShip());
default:
break;
}
return nullptr;
}
std::vector<std::unique_ptr<Ship>> ships;
ships.push_back(makeShip(Samll));
ships.push_back(makeShip(Medium));
ships.push_back(makeShip(Big));
// now fly your ship!!!
Run Code Online (Sandbox Code Playgroud)