C++ 接口(interface)交换

标签 c++ abstract-class pure-virtual

我正在尝试通过创建仅具有纯虚拟方法的类来使用 C++ java/C# 类接口(interface),如下所示:(这只是一个示例)

class IMyInterface
{
public:
    virtual int someFunc() = 0;
    virtual ~IMyInterface() {}
};

一切都很好,直到我被困在实现一个交换 IMyInterface 数组中的两个元素的方法之前,因为在 C++ 中不允许实例化接口(interface),因为编译器会提示 temp 未实现 someFunc()

void Exchange(IMyInterface* array, int i, int j)
{
    IMyInterface temp = array[i]; // not allowed
    array[i] = array[j];
    array[j] = temp;
}

所以我不得不更改接口(interface)类定义并摆脱纯虚函数并提供方法的“默认”实现,如下所示:

class IMyInterface
{
public:
    virtual int someFunc()
    {
        return 0;
    }
    virtual ~IMyInterface() {}
};

问题是 IMyInterface 不再是一个接口(interface),它不会强制任何将从它继承的类实现 someFunc()

有什么办法吗?

最佳答案

接口(interface)不是完全定义的对象,因此您不能创建它们的实例。它们具有未定义的大小和结构,因此显然不能在值上下文中创建或使用它们。但是,您可以创建指向接口(interface)的指针(Happy Guys?),因为指向对象的指针定义得很好。示例代码可以变成:

void Exchange(IMyInterface** array, int i, int j)
{
    IMyInterface* temp = array[i]; // allowed :)
    array[i] = array[j];
    array[j] = temp;
}

如果操作应该按值完成,那么模板函数可能更合适。

关于C++ 接口(interface)交换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14950784/

相关文章:

c++ - boost 程序选项 parse_config_file

c++ - 在 C 或 C++ 中处理循环依赖的最佳方法?

c++ - 没有匹配函数来调用 Foo::Foo

java - 我需要在各自的接口(interface)中声明抽象类的方法吗?

c++ - 使用虚拟纯函数访问字段的段错误

c++ - 如何在 Linux 中高效等待 RS232 的 CTS 或 DSR?

c++ - 使类抽象化有什么好处

c# - 继承具有抽象属性的抽象类

C++ 抽象基模板类非 Void 方法

c++ - boost python中使用纯虚函数的多个派生类