好吧,std::auto_ptr
不是源于std::auto_ptr
.但是B
源于A
.auto_ptr不知道那个(它不是那么聪明).看起来您想使用共享所有权指针.boost::shared_ptr
是理想的,它还提供了dynamic_pointer_cast:
boost::shared_ptr a = new A(); boost::shared_ptr b = dynamic_pointer_cast (a);
对于auto_ptr,这样的事情无法真正起作用.因为所有权将转移到b
.但如果演员表失败,b就无法获得所有权.目前还不清楚该怎么办.您可能不得不说,如果演员表失败,将继续拥有所有权 - 这听起来会导致严重的麻烦.最好开始使用shared_ptr.两者a
并b
随后将指向同一个对象-但B
作为shared_ptr
和a
作为shared_ptr
好吧,std::auto_ptr
不是源于std::auto_ptr
.但是B
源于A
.auto_ptr不知道那个(它不是那么聪明).看起来您想使用共享所有权指针.boost::shared_ptr
是理想的,它还提供了dynamic_pointer_cast:
boost::shared_ptr a = new A(); boost::shared_ptr b = dynamic_pointer_cast (a);
对于auto_ptr,这样的事情无法真正起作用.因为所有权将转移到b
.但如果演员表失败,b就无法获得所有权.目前还不清楚该怎么办.您可能不得不说,如果演员表失败,将继续拥有所有权 - 这听起来会导致严重的麻烦.最好开始使用shared_ptr.两者a
并b
随后将指向同一个对象-但B
作为shared_ptr
和a
作为shared_ptr
动态转换不起作用.A : public B
并不意味着auto_ptr : public auto_ptr
.这就是boost shared_ptr
提供的原因shared_dynamic_cast
.你可以写一个auto_ptr
动态演员:
templatestd::auto_ptr auto_ptr_dynamic_cast(std::auto_ptr & in) { auto_ptr rv; R* p; if( p = dynamic_cast ( in.get() ) ) { in.release(); rv = p; } return rv;
}
请注意这里发生的事情.由于auto_ptr
s具有所有权语义,因此成功的向下转换意味着原始更通常的类型,auto_ptr不再拥有所有权.