2017-09-12 10 views
4

オブジェクトへの複数のポインタの使用に関する質問があります。 私はベクトル内のポインタとマップ内のポインタを持っています。 マップはベクトルを使用してオブジェクトのインデックスを作成します。例コード:ベクトル/マップによるオブジェクトへの複数のポインタの使用方法

class Thing 
{ 
public: 
    int x = 1; 
}; 

Thing obj_Thing; 

std::vector<Thing*> v_Things; 

v_Things.push_back(&obj_Thing); 

std::map<int, Thing*> m_ThingMap; 

m_ThingsMap[v_Things[0]->x] = v_Things[0]; // crucial part 

このようにポインタを割り当てるのは良い方法ですか?

代わりにベクターやマップにアドレスを保持する必要がありますか?または、私は地図のポインタへのポインタを使用する必要がありますか?

+1

'v_Things(0)'はおそらく 'v_Things [0]'でしょうか?そして 'v_Things.push_back(&obj_Thing);'は非常に危険です。つまらないポインタを簡単に作成する可能性があります( 'obj_Thing'寿命はベクトルとマップよりも早く終了することがあります) – UnholySheep

+1

' Thing * 'を格納する代わりに、オブジェクトがあまりにも早く割り当て解除されないようにするために 'std :: shared_ptr 'を代わりに保存してください(そして2つの別々の "物"の間で共有されていることを示すために) – UnholySheep

+0

v_Thingsのすべてのメンバーが必然的にm_ThingsMapに含まれない場合、私はまだshared_ptrを使用していますか? –

答えて

4

すべては、あなたが何をしたいかによって異なります。

しかし、あなたのアプローチは、あなたのプロジェクトが成長したとき、特に他の人がそれに貢献するときに、本当に毛深くなることがあります。また、std::vectorに生のポインタを格納することは可能ですが、あなたが宙ぶらりんになってしまう可能性があるため、特別なケアを必要とする

m_ThingsMap[v_Things[0]->x] = v_Things[0]; 

m_ThingsMap[v_Things[0]->x] = v_Things(0); 

次のようになります。これは、で開始する

ポインタが指し示すオブジェクトがあまりにも早く解放された場合、ポインタ。

私はあなたがこのように、 std::weak_ptrを使用することをお勧めそのために

:あなたはそのアプローチに固執することを決定した場合に

std::vector<std::weak_ptr<Thing>> v_Things; 

(私が意味する場合は、別のポインタからポインタの共有であるオブジェクトへのポインタポイント)。


私があなただったら、あなたのコードは十分にはっきりしていないので、自分の考え方を再設計します。誰かがすべてのポインタや共有場所で何が起こっているのかを理解するのに1〜2時間かかります。

+1

私はこうします:p ------- – Quentin

関連する問題