0

因此,快速总结一下我为什么要这样做:

我正在制作一个太空飞行程序,其中(一旦我在不止一艘飞船上编码)我将能够存储不同的飞船,例如craft[HAB]、craft[AYSE]、craft[ISS] 等等。目前,我只在一艘船上编码,我这样声明:

enum craft {HAB, CRAFTMAX};
...
[declaring ship class here]
...
ship craft[CRAFTMAX];

然而,并不是所有的船都是相同的结构。例如,HAB(Habitat 的缩写)将是一个底部有三个引擎吊舱的圆圈,AYSE 将是一个空间站,其中心有一根管子和对接灯,等等。我正在让这些函数在屏幕上绘制一个矢量。

目前,我已经声明了 ship::draw,我只是用它来绘制 Hab。但是,我希望能够修改每个绘图函数来绘制该船,即craft[AYSE].draw() 将具有与craft[HAB].draw() 不同的声明。

我已经想过,并寻找了不同的方法来做到这一点,但我没有取得太大的成功。我仍然希望能够遍历所有工艺,以便于计算重力和碰撞。但是我猜如果函数是数组的元素时不能单独声明它们,那么单独声明每艘船不会太麻烦,因为最多只有 10 个。

如果您想查看任何其他代码,这是我的 git 存储库,它正在存储它。它肯定有点杂乱无章,因为它是一个垄断项目,我只看到自己在使用它。

你们中有人尝试过吗?我敢肯定那里一定有几个人!

并提前感谢。

4

4 回答 4

3

我认为通过为 Ship 对象使用基类,然后为不同类型的船舶派生该基类,您会好得多。然后使用一些容器,允许您遍历所有船舶对象并调用相应的函数。像:

class Ship {
public:
  virtual void draw() const = 0;
};

class HAB : public Ship {
  virtual void draw() const;
};

class AYSE : public Ship {
  virtual void draw() const;
};

然后使用像这样的容器:

vector<Ship> ships;
ship.insert(HAB());
ship.insert(AYSE());

// to draw
for_each(ships.begin(), ships.end(), mem_fn(&Ship::draw));

我很快就想出了这个,所以你必须弄清楚细节。您考虑这样做的方式不是很OO,并且在维护方面会遇到问题(想想单点维护)。

于 2012-04-15T01:43:37.947 回答
0

我不喜欢您的代码的外观 - 使用craft一词作为类型标识符和变量标识符......

但是从您的问题来看,您似乎想使用继承。所以你声明一个

class ship {
    // put here all methods that all ships have and that are the same
    // and all data that all ships.
    virtual void Draw( ) = 0; // subclasses of ship are forced to implement their own Draw
    // etc.
    };

现在,当您想要一个船舶数组时,将其设为船舶指针数组。然后,您可以放入指向子类的指针,并dynamic_cast在需要时使用来获取指向子类的指针。但是通过调用A[4]->Draw(),您将获得Draw适合数组位置 4 中对象的任何例程。

于 2012-04-15T01:48:56.187 回答
0

您可能想要声明一个基类并将每种类型的船实现为子类。

class HAB: public ship{
  //code here
};

有关继承的更多信息:请参阅本教程

冒号表示HAB从类继承成员数据和功能ship。这样,您可以在每个子类中唯一地定义一些函数,同时仍然让它们与基类共享重要的函数。例如,每种船型都可能具有类似get_position()的成员函数,而绘图函数则具体取决于每种船型。

多态性的美妙之处在于您可以将子类称为它们的父类。因此,您可以创建一个ship *(发送指针)数组来引用子类数组。

ship * array[CRAFTMAX];
array[0]=new HAB;

然而,在使用这种东西之前,您应该真正了解您的指针,因为管理不善会导致内存泄漏。也就是说,您分配内存并且永远不会释放它。

这个网站有一些关于多态性的很好的说明。

于 2012-04-15T01:50:01.773 回答
0

OO 方法是创建类型的层次结构,每种类型代表一种飞机类型。使用虚函数为通用接口(在基类中声明)提供不同的实现。

一旦你有了这个,你将需要多态地将对象存储在容器中(即不是对象,而是指向对象的智能指针)。( smart ) 指针将是基本类型和实际类型的对象。我建议您使用更高级别的容器而不是数组(即std::vector<std::unique_ptr<ship>>

于 2012-04-15T01:50:59.313 回答