2011-08-05 4 views
1

ここ オブジェクトを配列、リスト、またはマップの参照としてどのように格納することができますか?

class Bird{ 
public: 
int a; 
}; 

void fn(Bird& obj){ 
Bird& arrayList[5]; 
arrayList[0] = obj; 
arrayList[0].a = 10; 
} 

ArrayListの中の任意の更新は マイ要件がobjオブジェクトのコピーを停止することであるOBJオブジェクトに反映されない配列

の例を取ることができます。 arraylistはobjを参照する必要があります。

Plsのは、あなたが参照の配列を持つことができない鳥

+3

あなたはなぜあなたがこれをしたいのかを説明する必要があります(例はばかげています。なぜなら、最初の要素にアクセスしたときに配列を持つ理由)。参照を初期化するだけで、割り当てられないので(質問は参照ではなく参照されたオブジェクトに割り当てられます)、疑問を抱いているので、おそらく不可能です。 –

+1

ポインタはこの目的のために正確に設計されています。もちろん、生のポインタ( 'Bird *'のような)を使うとき、オブジェクト所有ポリシーは、オブジェクト(ポインタを保持したまま)が存在することを確認する必要があります。共有の所有権が必要な場合は、(boost :: shared_ptr 'のような)スマートなポインタが必要です。ポインタを使用しない理由は何ですか? –

答えて

3

へのポインタの配列を使用しないでください。

+0

しかし、あなたはポインタの配列を持つことができます。 –

+0

@Alexandre C:私もそれを追加したいと思っていましたが、OPはポインタの配列を使いたくなかった、 'PlsはBird'へのポインタの配列を使わないので、助言するものは少し失われましたか? :) –

+0

私の助言は、ポインタの配列を使用することです。 OPがポインタの配列を使いたくない場合、彼は自分が望む期間を達成することができません。 –

0

あなたは中古建設:

Bird& arrayList[5]; 

が許可されていません。あなたは、オブジェクトそのものを保存する必要があります。

vector<Bird> Birds; 
Bird arrayList[5]; 

またはポインタ

vector<Bird*> Birds; 
Bird* arrayList; 

これらは唯一の推奨オプションです。

+0

なぜ、正確に*は参照作業をしていませんか? (少し徹底した返信やリンクを洗い流そうとしています) –

+0

@pst:FredOverflowの答えがあなたの質問をクリアすると思います –

2

C++標準はこれについてはっきりしています(8.3.2と8.3.4を参照)。要約すると、配列はオブジェクトのシーケンスです。参照はではなく、オブジェクトです。したがって、参照の配列を持つことはできません。

(同様の理由で、参照への参照やポインタへの参照はありません:参照がオブジェクトの別名であり、ポインタがオブジェクトを指しますが、参照は自分自身ないオブジェクトですが)

関連する問題