在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/

10-13 08:26