4

我在类 (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 点左右进行了更新。

4

2 回答 2

4

对于不应该共享的任何指针,该类拥有唯一的所有权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));
    }
};

如果拥有对象具有复制构造函数,则在创建自身副本时,它必须在其拥有的对象上调用此克隆成员函数。

于 2012-03-12T11:39:29.013 回答
0

如果你想创建拥有指针向量的对象,你应该使用 boost::vector_ptr。它会自动删除自身包含的所有对象

于 2012-03-12T11:56:21.363 回答