繁体   English   中英

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

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

我在类(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 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM