c++ - 界面的解决方法

标签 c++ inheritance interface

在 C++ 中,我如何声明一个接口(interface) 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++ 没有“接口(interface)”和“类”作为单独的概念)。

class Emeny_type1 : public Enemy { 
    // ...
};

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

void EnemyManager::addEnemy(Enemy const *e) { 
    enemies.push_back(e);
}

这确实引发了对象生命周期和所有权的问题(这在 Java 中大多不是问题)。当你将一个项目添加到收藏中时,你需要确保它在你要使用它的时候不会被销毁,并且一旦你用完它就会被销毁(例如,当一个敌人被打败时,你可能想删除它)。您需要决定 EnemyManager 是要删除不再需要的敌人,还是要删除一些其他代码。如果 EnemyManager 要删除它们,您可能需要(或想要)向 Enemy 接口(interface)添加一个 clone 函数,以便它获取要添加到集合中的对象的拷贝。

编辑:根据您的评论,您不太确定如何使用您收藏中存储的指针的 Enemy“界面”。幸运的是,这相当简单,就像这样:

for (int i=0; i<enemies.size(); i++)
    enemies[i]->doStuff();

关于c++ - 界面的解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7809047/

相关文章:

c++ - boost::unordered_set of char16_t 字符串

c++ - 指向char的指针和指向word的指针之间的区别

java - 如何在不编写重复代码的情况下处理继承链中的默认值?

php - 在 PHP 中重写派生类中的静态成员

java - 实现一个接口(interface),该接口(interface)有一个返回接口(interface)的方法,但收到未实现的错误

c++ - 尽管已指定包含目录,但 Visual Studio 在编译期间无法找到头文件

c++ - 我的程序中出现访问冲突(段错误)

php - 实现支持多种登录方式的User类

c# - C# 中的委托(delegate)与接口(interface)

vb.net - “PlotBackBrush”无法通过类 'IRectangleBrush' 在项目外部公开类型 'PlotSurface2D'