所以,快速总结我为什么要这样做:
我正在制作太空飞行计划,其中(一旦我在不止一艘船上编码),我将能够存储不同的船只,例如:工艺[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,如果您想查看其他任何代码。它绝对有点无组织,因为它是一个垄断项目,我只是看到自己使用它。
你们中有人试过这样做吗?我相信那里肯定会有几个人!
提前谢谢。
答案 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>>
)