gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 01:15:50 24 4
gpt4 key购买 nike

我在类 (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));
}
};

如果拥有对象有一个复制构造函数,那么在创建自己的拷贝时,它必须在它拥有的对象上调用这个克隆成员函数。

关于C++11 将传统指针转换为智能指针。使用来自 llvm 的最新 SVN Clang 和 libc++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9666193/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com