2012-09-23 72 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

猜猜它解决了它。我对这些新功能非常谨慎,因为我没有看到任何真正的代码。正如我听说在任何地方都用“聪明的替换你的原始指针”一样,我开始认为不再需要原始指针了(这不是很聪明,我承认...)谢谢 –

相关问题