我在一个类(A)中有一个函数,它本质上将一个指向另一个类(B)的指针作为参数。B类由它也应该接受的多个其他类继承。

我想要做的是取得这个指针的所有权来存储以供以后在类中使用,它不会在类之外再次用于其他任何事情。虽然我会使参数成为shared_ptr,但我想尽可能避免这种情况,因为我与之合作的其他人不太了解整个智能指针的事情。有什么办法可以做到这一点吗?

这里有一个我想做的例子,尽管从我测试的情况来看,这是行不通的。

//In .h file
std::vector< unique_ptr< B > > data_store;

//In .cpp file
void A::add_data(B* NewItem)
{
    data_store.resize(data_store.size()+1);
    data_store[data_store.size()-1] = NewItem;
}

其次,我想也许使用复制构造函数或类似的东西在类内使用智能指针:随着我不得不做的事情,如果我不得不手动删除,它可能会变得有点丑陋。这样做的问题是,我不知道它是基类(B)进来,还是它是从B继承的类。我不太确定如何处理这个问题,而不必为类硬编码某种可检查的ID,并使用正确的复制/移动构造函数,我想不惜一切代价避免。

我正在使用llvm更新的Clang和libC++,我在2012年3月12日英国时间上午10点左右更新。

有帮助吗?

解决方案

对于任何不应该共享的指针,该类拥有 std::unique_ptr<T> 是正确的选择。当拥有的对象超出范围/被删除时,它会自动删除指针。我实际上建议不要为此使用共享指针,因为它会与其他开发人员沟通这个成员应该被共享。

所以复制。由于您有一个指向可能具有子类的对象的指针,因此您需要使用 clone 成语而不是普通的复制构造函数。它通常通过具有虚拟 clone 返回指向类的指针(或智能指针)的函数。这需要所有子类重新实现这一点,返回自己的副本。

class Base {
    ...
    virtual std::unique_ptr<Base> clone() const = 0;
    ...
};

class Subclass {
    ...
    virtual std::unique_ptr<Base> clone() const {
        return std::unique_ptr<Base>(new Subclass(*this));
    }
};

如果拥有的对象有一个复制构造函数,它将不得不在创建自己的副本时对其拥有的对象调用此克隆成员函数。

其他提示

如果要创建对象,则拥有指针的向量矢量,您应该使用Boost :: Vector Ptr。它会自动删除其自身中包含的所有对象

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top