C++11将传统指针转换为智能指针.使用来自llvm的最新SVN-Clang和libc++

C++11 Convert traditional pointer to smart pointer. Using up-to-date SVN Clang and libc++ from llvm

本文关键字:指针 llvm 最新 SVN-Clang libc++ 传统 转换 智能 C++11      更新时间:2023-10-16

我在一个类(a)中有一个函数,它基本上将指向另一个类的指针作为参数。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。它自动删除自身中包含的所有对象