2012-09-23 6 views
7

私はいくつかのコードをC++ 11-ingしています。私は私が今考えそうでない場合は、所有権とrawポインタにunique_ptrを使用しますか?

class X { /* */ }; 

class A { 
    std::vector<X*> va_x; 
}; 

class B { 
    std::vector<X*> vb_x; 
    std::vector<A> vb_a; 
}; 

を持ってもX * s「のVb_xと」の私のクラスB

内部で指されているオブジェクトへのX * sの「va_x」の私のクラスの内側の点スマートポインタを使うのが好きです。私にとって、だから私はB内のX用のunique_ptrをを使用する必要があります

(特に私のAのインスタンスがBに属しているため)、クラスBは、X *が指すオブジェクトの所有権を有していることが明らかと思わ:

class B { 
    std::vector<unique_ptr<X>> vb_x; 
    std::vector<A> vb_a; 
}; 

私の質問は、クラスAで何をすべきですか?私は生のポインタを保持する必要がありますか?そうすることによって、私のユニットテストでは、私は(それがポイントではないですが、カプセル化の心配はありません)例えば、それは厄介なもの(IMO)につながることを認めなければならない:

unique_ptr<X> x(new X()); 
A a; 
a.va_x.push_back(&(*x)); //awkward, but what else can I do? 

A.vb_a.push_back(a); //ok 
B.vb_x.push_back(move(x)); //ok 
+0

C++ 11に関する今後の質問については、C++でタグ付けしてください。 :) – Xeo

+1

以前に事実上同じ質問をしていませんでしたか? – Puppy

+0

@DeadMGまあ、以前のものもunique_ptrについてですが、これは私が考えると同じではありません –

答えて

9

あなたはx.get()を使用することができ、内部ポインタを返します。

他にも、所有していない参照を処理するための生ポインタを使用する方法があります。this questionも参照してください。

+0

ありがとうございました。しかしこれはそれほど良いことではありませんか?とにかく私は生のポインタを使うべきですか? –

+0

@BérengerBerthoul:何も所有していない限り、未処理のポインタは何も問題ありません。名前が言うように、彼らは物事を指すべきであり、すべてはOKです。 – Xeo

+0

それはそれを解決したと思います。これらの新しい機能については、実際のコードが見当たらないので、私は非常に慎重です。そして、「生のポインタをスマートなものに置き換える」と聞いたので、私はもう生ポインタが必要ではないと思っています(これはあまりスマートではありません...)Thanks: –

関連する問題