关于C++:重载-gt和*:如何访问初始类?

Overloaded -> and *: how to access initial class?

我有一个包含Matrix类型的数据的类Property,它重载了操作符->*&Matrix是我的另一个类。重载允许直接访问数据,例如

1
2
Property myProp;
myProp->trace();

上面的代码允许直接从包含矩阵的Property计算矩阵的轨迹,而无需首先获取数据:方便。

现在,我想添加一个对我的Property的回调,当Property更新时调用这个回调。为了做到这一点,我希望能够写下如下内容:

1
myProp->registerCallback(myCallback);

我的问题是,operator->返回对Matrix的引用,因此registerCallback被调用在矩阵类上,而不是在Property上。由于我还重载了其他操作符*&,因此我似乎无法再从Property调用成员函数。

因此我的问题是:在一个操作符被重载以返回另一个类型之后,是否有任何技巧可以使用基本类型?

谢谢!


在C++ 11中有EDCOX1×0函数。Boost库还提供了addressof功能。例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <iostream>
#include <memory>

struct Data
{
    void foo() {
        std::cout <<"Data::foo" << std::endl;
    }
};

template <typename T>
class Property
{
public:
    Property() : data(new T) {}
    ~Property() { delete data; }

    T** operator &() {
        return &data;
    }

    T* operator->() {
        return data;
    }

    void foo() {
        std::cout <<"Property::foo" << std::endl;
    }

private:
    T *data;
};

int main()
{
    Property<Data> p;

    p->foo();
    std::addressof(p)->foo();
}


您仍然可以使用.运算符调用Property中的函数…

1
2
3
Property myProp;
myProp->trace();
myProp.registerCallback(myCallback);

你有个小误会。如果你超载了operator*operator->,那么你的对象就是试图像指针一样工作。这种情况经常出现在迭代器中。迭代器的方法是用这样的.调用的。

我不知道你为什么要让operator&超负荷运行;为了达到和fasked的operator&相同的效果,只需使用&(*myProp)。另外,&myProp应该给你myProp的地址,而不是它所包含的对象。