21

C++ 继续让我感到惊讶。今天我发现了 ->* 运算符。它是可重载的,但我不知道如何调用它。我设法在课堂上重载它,但我不知道如何调用它。

struct B { int a; };

struct A
{
    typedef int (A::*a_func)(void);
    B *p;
    int a,b,c;
    A() { a=0; }
    A(int bb) { b=b; c=b; }
    int operator + (int a) { return 2; }
    int operator ->* (a_func a) { return 99; }
    int operator ->* (int a) { return 94; }
    int operator * (int a) { return 2; }
    B* operator -> () { return p; }


    int ff() { return 4; }
};


void main()
{
    A a;
    A*p = &a;
    a + 2;
}

编辑:

感谢答案。要调用我写的重载函数

void main()
{
    A a;
    A*p = &a;
    a + 2;
    a->a;
    A::a_func f = &A::ff;
    (&a->*f)();
    (a->*f); //this
}
4

3 回答 3

16

就像.*,->*与指向成员的指针一起使用。C++ FAQ LITE有一整节专门针对指向成员的指针。

#include <iostream>

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

int main(void) {
    foo *obj = new foo;
    void (foo::*ptr)(void);

    ptr = &foo::bar;
    (obj->*ptr)();
    ptr = &foo::baz;
    (obj->*ptr)();
    return 0;
}
于 2009-11-22T19:29:33.660 回答
10

重载->*运算符是二元运算符(虽然.*不可重载)。它被解释为一个普通的二元运算符,所以在你原来的情况下,为了调用那个运算符,你必须做类似的事情

A a;
B* p = a->*2; // calls A::operator->*(int)

您在 Piotr 的答案中读到的内容适用于内置运算符,而不适用于您的重载运算符。您在添加的示例中调用的也是内置运算符,而不是重载的运算符。为了调用重载运算符,您必须执行我在上面示例中所做的操作。

于 2009-11-22T19:57:23.937 回答
1

像任何其他运算符一样,您也可以显式调用它:

a.operator->*(2);
于 2009-11-22T22:06:19.150 回答