3

我正在经历这个重载 ->* 运算符的特殊示例。我努力克服为什么我们需要重载 () 运算符,但经过大量谷歌搜索和 reerences 后无法得到它。Eckel 说,当调用 operator ->* 时,编译器立即转身并调用 operator()对于 operator ->* 的返回值。现在我知道我们想要使用这个 ->* 运算符的目的是充当类的智能指针,它应该能够像普通指针一样引用成员函数。所以我们像 (w->* pmf)(1) 那样做,在这里我认为 ->* 需要知道 () 中 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;
}
4

0 回答 0