在C ++中,如何声明接口s.t。我可以如下所示使用它:
/** Enemy "Interface" */
Class Enemy {
Enemy();
virtual ~Enemy();
virtual void doStuff() = 0;
};
/** Enemy of type 1 */
Class Enemy_type1 : public Enemy {
Enemy_type1();
virtual ~Enemy_type1();
virtual void doStuff() {
// different for every type of enemy
}
};
/** Add an enemy to EnemyManager */
void EnemyManager::addEnemy(Enemy * e) {
this->enemies.push_back(*e); // declared as vector<Enemy> enemies;
}
最佳答案
首先,您必须(或至少要)使构成接口的函数公开:
class Enemy {
public:
Enemy();
virtual ~Enemy();
virtual void doStuff() = 0;
};
然后,您将从中继承(C ++没有“接口”和“类”作为单独的概念)。
class Emeny_type1 : public Enemy {
// ...
};
最后,由于它们是多态类型,因此您将要创建一个指向敌人而不是实际敌人对象的指针的集合:
void EnemyManager::addEnemy(Enemy const *e) {
enemies.push_back(e);
}
这确实引起了对象生存期和所有权的问题(在Java中大多数不是问题)。当您向收藏中添加物品时,您需要确保它不会被破坏,只要您打算使用它,并且一旦完成就被销毁(例如,当敌人被打败,您可能要删除它)。您需要确定EnemyManager是否要删除不再需要的敌人或其他代码。如果EnemyManager打算删除它们,则可能需要(或想要)向您的Enemy接口添加
clone
函数,以使其获得要添加到集合中的对象的副本。编辑:根据您的评论,您不太确定如何使用存储在集合中的指针的“敌人”接口。幸运的是,这很简单,就像这样:
for (int i=0; i<enemies.size(); i++)
enemies[i]->doStuff();
关于c++ - 界面的解决方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7809047/