首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >接口的解决方法

接口的解决方法
EN

Stack Overflow用户
提问于 2011-10-18 22:37:24
回答 2查看 119关注 0票数 0

在C++中,我如何声明一个接口s.t。我可以使用它,如下所示:

代码语言:javascript
复制
/** 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;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-10-18 22:43:18

首先,你必须(或者至少想要)公开组成你的接口的函数:

代码语言:javascript
复制
class Enemy {
public:
    Enemy();
    virtual ~Enemy();
    virtual void doStuff() = 0;
};

然后您将继承它(C++没有将“接口”和“类”作为单独的概念)。

代码语言:javascript
复制
class Emeny_type1 : public Enemy { 
    // ...
};

最后,由于这些都是多态类型,您需要创建一个指向敌人的指针集合,而不是实际Enemy对象的指针集合:

代码语言:javascript
复制
void EnemyManager::addEnemy(Enemy const *e) { 
    enemies.push_back(e);
}

这确实带来了对象生存期和所有权的问题(这在Java中大多不是问题)。当你将一个物品添加到集合中时,你需要确保只要你要使用它,它就不会被销毁,并且一旦你使用完它就被销毁(例如,当一个敌人被击败时,你可能想要移除它)。您需要决定EnemyManager是要删除不再需要的敌人,还是要删除其他一些代码。如果EnemyManager要删除它们,您可能需要(或想要)向Enemy接口添加一个clone函数,以便它获得要添加到集合中的对象的副本。

编辑:根据您的评论,您不太确定如何使用已存储在集合中的指针的Enemy“接口”。幸运的是,这相当简单,就像这样:

代码语言:javascript
复制
for (int i=0; i<enemies.size(); i++)
    enemies[i]->doStuff();
票数 5
EN

Stack Overflow用户

发布于 2011-10-18 22:47:03

代码语言:javascript
复制
/* 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
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7809047

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档