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

Possible to declare elements of a function array individually?

本文关键字:数组 元素 函数 声明 单独      更新时间:2023-10-16

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

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

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

但是,并非所有船舶的结构都相同。例如,HAB(Habitat的缩写)将是一个底部有三个发动机吊舱的圆圈,AYSE将是一个空间站,有一个管子通往中心,对接灯,等等。我正在使这些功能在屏幕上绘制一个矢量。

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

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

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

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

提前感谢。

我认为通过对 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,并且在维护方面会遇到问题(想想单点维护)。

我不喜欢你的代码的外观 - 使用"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例程。

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

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

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

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

有关继承的详细信息:请参阅本教程。

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

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

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

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

这个网站在多态性方面有一些很好的指导。