【问题标题】:Member selection with overloaded dereferencing operator使用重载取消引用运算符的成员选择
【发布时间】:2012-01-26 09:08:34
【问题描述】:

如果重载解引用运算符 (operator*),成员选择运算符 (operator->) 是使用重载运算符还是需要重载它?

【问题讨论】:

    标签: c++ pointers operator-overloading


    【解决方案1】:

    您需要单独重载箭头运算符。更一般地说,即使 C++ 中相关运算符之间存在良好的映射关系,如果重载一个运算符,您也不会“免费”重载其余运算符,而必须自己实现它们。

    也就是说,在解除引用方面很容易实现箭头:

    T* Class::operator -> () const {
        return &**this;
    }
    

    这通过取消引用this 来获取对接收者对象的引用,然后取消引用以调用operator *,然后获取返回引用的地址以获取指向应该应用箭头的对象的指针。

    您可能想查看Boost.Operators 库,它可以从一小组基本操作中自动定义许多逻辑相关的运算符。

    希望对你有帮助!

    【讨论】:

    • 所以实际上没有 operator-> 的“默认实现”?
    • @Paranaix- 不,很遗憾不是。更一般地说,即使有一种合理的方法可以从其他相关运算符中实现该运算符,也没有重载运算符的默认实现(保存赋值运算符)。
    • 当然你也可以很容易地实现一元operator*,比如operator->:return *(this->operator->());。 C++ 没有说你“应该”根据另一个实现哪个,或者费心查看你已经完成了哪个,然后为另一个提供默认值。与其他运算符类似,有不止一种方法可以做到这一点:用operator-= 实现二进制operator-,或者用一元operator- 和二进制operator+ 实现? C++ 不会告诉您“基本操作”是什么,也不会尝试弄清楚您认为它们是什么。它是一致的,如果没有帮助的话。
    • 如果你经常这样做,也可以根据其他运算符(例如在 CRTP mixin 类中)定义一些运算符的默认实现(像这样),并让每个类你想要使用它们继承自它,但是 -> 足够简单并且很少使用它可能不值得。
    【解决方案2】:

    你基本上可以实现一个重载的解引用操作符,但是你必须引用它两次才能让你的重载操作符发挥作用!

    【讨论】:

      【解决方案3】:

      5.2.5 “如果 E1 的类型为“指向类 X 的指针”,则表达式 E1->E2 将转换为等效形式 (*(E1)).E2”。问题在于,在您的情况下,E1 不是指针。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多