实际类的数组

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)

我真的不希望它编译,只是寻找一种更简单的方法,这只是一个非常长的尝试.

bil*_*llz 5

您可以委派一个函数来创建不同的船只,它通常被称为工厂模式.数组也不处理多态,你需要使用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)