可以单独声明函数数组的元素吗?

时间:2012-04-15 01:30:02

标签: c++ arrays function allegro

所以,快速总结我为什么要这样做:

我正在制作太空飞行计划,其中(一旦我在不止一艘船上编码),我将能够存储不同的船只,例如:工艺[HAB],工艺[AYSE],工艺[ISS]等。目前,我只在一艘船上编码,我声明如下:

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

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

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

我想过,并且想方设法不同,但我没有取得多大成功。我仍然希望能够遍历所有工艺,以便于计算重力和碰撞。但是我猜测当它们是数组的元素时是否不可能单独声明函数,单独声明每艘船并不会太麻烦,因为只有10,最大。

Here is my git repository that is storing this,如果您想查看其他任何代码。它绝对有点无组织,因为它是一个垄断项目,我只是看到自己使用它。

你们中有人试过这样做吗?我相信那里肯定会有几个人!

提前谢谢。

4 个答案:

答案 0 :(得分: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));

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

答案 1 :(得分: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(),您将获得适合于阵列位置4中的对象的任何Draw例程。

答案 2 :(得分:0)

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

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

有关继承的更多信息:请参阅this tutorial

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

多态的美妙之处在于您可以将子类称为其父类。所以你可以创建一个ship *(船舶指针)数组来引用一个子类数组。

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

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

This website在多态性方面有一些很好的指导。

答案 3 :(得分:0)

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

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