質問

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
}
役に立ちましたか?

解決

過負荷 ->* オペレーターはバイナリ演算子です(しばらくします .* 過負荷ではありません)。それは通常のバイナリ演算子として解釈されるので、その演算子を呼び出すためにあなたの元のケースでは、あなたは次のようなことをしなければなりません

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

Piotrの答えで読んだものは 組み込み オーバーロードされたオペレーターではなく、オペレーターではありません。追加の例であなたが呼ぶものも 組み込み オペレーターは、過負荷のあるものではありません。オーバーロードされたオペレーターを呼び出すには、上記の私の例で私がしていることをしなければなりません。

他のヒント

と同じように .*, ->* メンバーへのポインターとともに使用されます。セクション全体があります 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;
}

他のopperatorと同様に、明示的に呼び出すこともできます。

a.operator->*(2);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top