2012-09-23 101 views
7

我是C++ 11中的一些代碼。我有否則使用unique_ptr作爲所有權和原始指針?

class X { /* */ }; 

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

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

「va_x」我的A級點內的X * s到對象也在我的B類中指出,通過「vb_x」的X * S現在

我會喜歡使用智能指針。對於我來說,似乎很清楚,B類具有由X *所指向的對象的所有權(尤其是因爲我的一個實例屬於B)

所以我應該使用的unique_ptr爲X B內:

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:只要沒有任何東西,使用原始指針就沒有*錯誤。正如名字所說,他們應該指出事情,一切都好。 – Xeo

+0

猜猜它解決了它。我對這些新功能非常謹慎,因爲我沒有看到任何真正的代碼。正如我聽說在任何地方都用「聰明的替換你的原始指針」一樣,我開始認爲不再需要原始指針了(這不是很聰明,我承認...)謝謝 –

相關問題