在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;
}发布于 2011-10-18 22:43:18
首先,你必须(或者至少想要)公开组成你的接口的函数:
class Enemy {
public:
Enemy();
virtual ~Enemy();
virtual void doStuff() = 0;
};然后您将继承它(C++没有将“接口”和“类”作为单独的概念)。
class Emeny_type1 : public Enemy {
// ...
};最后,由于这些都是多态类型,您需要创建一个指向敌人的指针集合,而不是实际Enemy对象的指针集合:
void EnemyManager::addEnemy(Enemy const *e) {
enemies.push_back(e);
}这确实带来了对象生存期和所有权的问题(这在Java中大多不是问题)。当你将一个物品添加到集合中时,你需要确保只要你要使用它,它就不会被销毁,并且一旦你使用完它就被销毁(例如,当一个敌人被击败时,你可能想要移除它)。您需要决定EnemyManager是要删除不再需要的敌人,还是要删除其他一些代码。如果EnemyManager要删除它们,您可能需要(或想要)向Enemy接口添加一个clone函数,以便它获得要添加到集合中的对象的副本。
编辑:根据您的评论,您不太确定如何使用已存储在集合中的指针的Enemy“接口”。幸运的是,这相当简单,就像这样:
for (int i=0; i<enemies.size(); i++)
enemies[i]->doStuff();发布于 2011-10-18 22:47:03
/* Enemy Interface (Abstract Base Class)
This goes in a header, say Enemy.hpp
*/
class Enemy {
public: // note default access is private in classes
Enemy();
virtual ~Enemy();
virtual void doStuff() = 0;
};
/* Add an enemy to EnemyManager.
The interface is a type, and is known!
It doesn't need to know anything about the subclasses
which implement the interface.
*/
void EnemyManager::addEnemy(Enemy * e) {
this->enemies.push_back(*e); // vector of Enemy POINTERS
}
/* Enemy of type 1.
This would go in say Enemy1.hpp - it depends on Enemy.hpp,
but EnemyManager doesn't need to know anything about this.
*/
Class Enemy_type1: public Enemy {
public:
Enemy_type1();
virtual ~Enemy_type1();
virtual void doStuff();
};
/* ... and in a .cpp file somewhere ... */
Enemy_type1::Enemy_type1() : Enemy()
{
// this is redundant unless you have some work for it to do
}
Enemy_type1::~Enemy_type1()
{
}
void Enemy_type1::doStuff()
{
// do your stuff here
}https://stackoverflow.com/questions/7809047
复制相似问题