2011-02-08 16 views
11

だから、それのためにどこでも研究した後、私はすなわち、クラス矢印演算子を作成して使用するにはどうすればよいですか?

class Someclass 
{ 
    operator->() /* ? */ 
    { 
    } 
}; 

、クラス矢印演算子を作成する方法を見つけることができないよう、私はちょうどそれと協力し、適切にそれを使用する方法を知っておく必要があります。 - 入力は何ですか? - 返品は何ですか? - 正しくプロトタイプを宣言するにはどうすればよいですか?

+3

入力がありません。戻り値の型はポインタでなければなりません。これは通常 "スマート"ポインタを作成するために使用されるため、ラップされたオブジェクトへのポインタを返します。 – Tim

答えて

14

に変換されます - >は、メンバーへのアクセスをオーバーロードするために使用されます。小さな例:

#include <iostream> 
struct A 
{ 
    void foo() {std::cout << "Hi" << std::endl;} 
}; 

struct B 
{ 
    A a; 
    A* operator->() { 
     return &a; 
    } 
}; 

int main() { 
    B b; 
    b->foo(); 
} 

この出力:

Hi 
+0

arrow演算子はクラスメンバのように構造体メンバを返すようにも機能しますか? – Codesmith

+0

クラスメンバを返すことができるように簡単に構造体メンバを返すことができます。矢印を使用すると何が起こるかは、演算子 - >()メンバー関数の本体によって決まります。行 "return&a;"適切であると判断したものを返すように変更することができます。 – Darryl

0

"矢印" 演算子は、によって過負荷にすることができます。

a->b 

オペレータ

return_type my_class::operator->() 
+0

'return_type {} - >() - >() - >()... - >()'は有効なコードでなければなりません。 – alfC

16

矢印オペレータには入力がありません。技術的には、それはあなたが望むものを返すことができますが、ポインタかポインタになることができるものを返すべきですthrough chained -> operators

あなたは以下のクラスを持つことができるように->オペレータは自動的に、operator*、内蔵のポインタ参照を使用してその引数を呼び出す前に、その戻り値ではなく逆参照:

class PointerToString 
{ 
    string a; 

    public: 
    class PtPtS 
    { 
     public: 
     PtPtS(PointerToString &s) : r(s) {} 
     string* operator->() 
     { 
      std::cout << "indirect arrow"; 
      return &*r; 
     } 
     private: 
     PointerToString &r; 
    }; 

    PointerToString(const string &s) : a(s) {} 
    PtPts operator->() const 
    { 
     std::cout << "arrow dereference\n"; 
     return *this; 
    } 
    string &operator*() const 
    { 
     std::cout << "dereference\n"; 
     return a; 
    } 
}; 

は次のようにそれを使用します

string::size_type size = (*ptr.operator->().operator->()).size(); 
:にコンパイラによって変換さ
PointerToString ptr(string("hello")); 
string::size_type size = ptr->size(); 

(と実際のポインタを返すために、必要に応じて.operator->()など多くの)と出力

arrow dereference 
indirect dereference 
dereference 

注意は、しかし、あなたは次の操作を行うことができなければならないこと:Stroupstrupから

PointerToString::PtPtS ptr2 = ptr.operator->(); 

オブジェクトの変換pポインタへの変換p.operator->()は、メンバーに依存しませんmを指します。これは、operator->()が単一の後置演算子であるという意味です。しかし、新しい構文が導入されていないので、入力がなければ、会員名は依然として必要です。

+0

まともなコンパイラでこのコードをコンパイルする方法はありません。 –

+0

@SebastianRedl、あなたは正しいです。私は説明とサンプルをコンパイルするように更新しました。 –

関連する問題