【问题标题】:Why can't a Visual C++ interface contain operators?为什么 Visual C++ 接口不能包含运算符?
【发布时间】:2011-01-03 00:49:15
【问题描述】:

根据MSDN doc on __interface,Visual C++ 接口“不能包含构造函数、析构函数或运算符。”

为什么接口不能包含操作符?返回引用的get方法之间有那么大的区别吗:

SomeType& Get(WORD wIndex);

还有重载的索引器操作符?

SomeType& operator[](WORD wIndex);

【问题讨论】:

    标签: c++ visual-c++ interface operator-overloading


    【解决方案1】:

    接口不能包含操作符,因为操作符不能是虚函数。本质上,接口是其他类派生的基类。

    编辑:在阅读了 cmets 并对此进行了更多思考后,我意识到这是多么愚蠢。请原谅我急切的手指。运算符与任何其他函数没有什么不同。一个更可能的原因与从公共基类派生的 __interface 生成类有关,以及 dll 必须具有它们在本地使用的所有构造函数、析构函数和赋值运算符。

    【讨论】:

    • 算子可以是虚拟的,相关问题:stackoverflow.com/questions/669818/…
    • 运算符在标准 C++ 中可以是虚拟的。其中很多不应该,因为例如operator= 应该采用与参数相同类型的引用,并且在尝试进行多态赋值时可能会遇到各种麻烦。但是operator[] 是多态性的合理候选者。不可否认,在纯 C++ 中,非虚拟接口惯用语通常更可取,但对于非运算符函数也是如此。
    【解决方案2】:

    __interface 修饰符是帮助实现 COM 接口的 Visual C++ 扩展。这允许您指定 COM '接口'并强制执行 COM 接口规则。

    而且因为 COM 是与 C 兼容的定义,所以不能有运算符、Ctor 或 Dtors。

    【讨论】:

    • 那么,如果我想要一个与操作符的“接口”,我唯一的选择是纯虚拟类吗?
    • 您的“唯一选择”是编写一个标准的 C++ 类,是的。根据您的需要,有很多方法。纯抽象类最接近 Java/C# 类型的接口,但在许多情况下,C++ 中更好的解决方案是不定义接口。使用模板提供的鸭子类型,并简单地定义一个类必须支持的概念,而不必费心要求它派生任何东西。或者使用 CRTP 成语为静态多态性提供接口。
    【解决方案3】:

    这看起来像一个 .dll 的东西。您需要一个方法名称,以便您可以在其他不支持运算符重载的语言中使用它,例如C

    【讨论】:

      猜你喜欢
      • 2016-03-01
      • 2011-01-08
      • 1970-01-01
      • 1970-01-01
      • 2011-09-30
      • 2020-10-28
      相关资源
      最近更新 更多