2016-12-19 15 views
0

ポインタの標準演算子として配列のopperator( - >)をオーバーロードして、コンソールにsomethinkを表示する必要があります。ネストされた呼び出しの配列演算子( - >)オーバーロード

そして、私がやった...

Gamer.hファイル(ネストされたCollecionクラスとゲーマークラス):

class Gamer { 

class Collection 
{ 
public: 
    Collection(); 
    Collection* operator->(); 
} 
public: 
Gamer(); 

Collection *deck; 
} 

Gamer.cpp

... 
Gamer::Collection* Gamer::Collection::operator->() 
{ 
    cout << "Pointer on deck >> " << this << endl; 
    return this; 
} 
... 

main.cppに - ここで私はゲーマーオブジェクトの宣言とのallocメモリ(ポインタなど)内のコレクションフィールドを持っている人

Gamer *gamer; 

Gamer::allocGamer(gamer); 

私はオーバーロードされた配列を使用したいopperand私が行うことはできません。

gamer->deck->(); 

しかし、私は次のことができます。

gamer->deck->operator->(); 

私はちょうどをgamer->デッキ呼び出すカントなぜ質問です - >();ゲーマー - >デッキ - >演算子 - >();を呼び出す必要があります。代わりに

2番目の質問 - オーバーロードされたopperandに直接アクセスするには、矢印opperをオーバーロードする必要があります。gamer-> deck->();

答えて

3

operator->は、2項演算子です。 「2項演算子」は、2つのオペランドをとることを意味します。たとえば:

deck -> foo 
//^  ^---- second operand 
// | 
// \------- first operand 

第二オペランドなしdeck->を書き込むことはできません。

deck->operator->();と呼ぶのは合法ですが、読者に混乱させるので、コードに頼るように設計するべきではありません。

operator->のオーバーロードの目的は、deck->fooと書くことができるようにすることです。 deck->fooを書こうとしない場合は、何をしようとしていてもoperator->を使用しないでください。

たとえば、関数にfooを取得させたい場合は、ではなくget_foo()とします。

注:Gamer::allocGamer(gamer);は(allocGamerが値によって、そのパラメータを取るならば、それはバグだし、それは参照することにより、それを取るならば、これはあなたのコードを読む人に混乱される異例のイディオムです)疑わしいです。メモリ管理を使用しない場合は、コードがよりシンプルになります。また、クラスのユーザーが手動でメモリ管理を使用する必要もありません。

+0

私はゲッターを作ることができることを知っていますが、私はそれを矢印のopperatorをスローする必要があります。それも可能ですか? –

+0

@PatrykJanikごめんなさいあなたに何を求めているのかわからない –

+0

私の投稿を編集できません。投げるのではなく、でなければなりません。 私はどのようにゲーマー - >デッキ - >演算子 - >()を変換する必要があるかわかりません。ゲーマー - >デッキ - >();オーバーロードされた関数を呼び出す。 –

関連する問題