重载时会发生什么 - > *运算符?

时间:2013-03-12 11:16:46

标签: c++ operator-overloading

我正在经历这个特殊的重载示例 - > *运算符。我努力克服为什么我们需要使用overload()运算符但是在经过大量的googling和reerence之后无法得到它.Eckel说当调用operator - > *时,编译器会立即转身并调用operator( )对于运算符的返回值 - > *。现在我知道我们想要的这个 - > *运算符就像一个类的智能指针一样,它应该能像正常指针一样引用成员函数。所以我们这样做(w-> * pmf)(1),在这里我认为 - > *需要知道int中的int的返回值,这就是为什么它在 - >之上被重载的原因; *运营商。在嵌套迭代器的情况下我有另一个疑问,为什么我们需要声明嵌套类,然后在重载 - >时将它声明为朋友。使它像嵌套迭代器?我是C ++的初学者,这就是为什么这些问题可能看起来太天真了,有些抱歉,但是我想深入了解这些东西,因为我一直在为重载而苦苦挣扎 - >和 - > *到现在为止。

#include <iostream>
using namespace std;
class Dog {
    public:
    int run(int i) const {
        cout << "run\n";
        return i;
    }
    int eat(int i) const {
        cout << "eat\n";
        return i;
    }
    int sleep(int i) const {
        cout << "ZZZ\n";
        return i;
    }
    typedef int (Dog::*PMF)(int) const;
    // operator->* must return an object
    // that has an operator():
    class FunctionObject {
        Dog* ptr;
        PMF pmem;
        public:
        // Save the object pointer and member pointer
        FunctionObject(Dog* wp, PMF pmf): ptr(wp), pmem(pmf) {
            cout << "FunctionObject constructor\n";
        }
        // Make the call using the object pointer
        // and member pointer
        int operator()(int i) const {
            cout << "FunctionObject::operator()\n";
            return (ptr->*pmem)(i); // Make the call
        }
    };
    FunctionObject operator->*(PMF pmf) {
        cout << "operator->*" << endl;
        return FunctionObject(this, pmf);
    }
};
int main() {
    Dog w;
    Dog::PMF pmf = &Dog::run;
    cout << (w->*pmf)(1) << endl;
    pmf = &Dog::sleep;
    cout << (w->*pmf)(2) << endl;
    pmf = &Dog::eat;
    cout << (w->*pmf)(3) << endl;
}

0 个答案:

没有答案