有没有更好的方法来添加两个智能指针?
Is there a better way to add two smart pointers?
>我重载了自写类的运算符+,我通过智能指针处理这些类的实例。现在我想知道是否有更好的方法来使用运算符。此外,我不知道如何将它们装回shared_ptr中。
class A
{
A operator + (A const & other)
{ //do some addition stuff and return new A}
};
std::shared_ptr<A> a, b;
//Currently I add them up like this
auto c = *a.get() + *b.get()
取消引用运算符对于"智能指针"是重载的。
你应该像这样将它们加起来:
*a + *b
如果你想要一个带有结果的共享对象,你可以从中创建一个共享对象:
auto c = std::make_shared<A>(*a + *b);
如果你有原始指针,你会这样做:
auto c = new A(*a + *b);
相似性并非巧合。
附带说明一下,除非您真的打算在多个所有者之间共享一个对象,否则您根本不应该使用shared_ptr
。
有没有更好的方法来添加两个智能指针?
不能添加智能指针。您在这里所做的是通过智能指针进行间接操作并添加指向的对象。
对 get(( 的调用是多余的。您可以直接通过智能指针间接:*a + *b
。
此外,我不知道如何将它们打包回shared_ptr
创建共享指针的一种简单方法是std::make_shared
。
您可以实现用于shared_ptr专用化的运算符:
class A
{
...
};
std::shared_ptr<A> operator+(const std::shared_ptr<A>& a1, const std::shared_ptr<A>& a2)
{
return std::make_shared<A>(*a1 + *a2);
}
使用简单
std::shared_ptr<A> a1, a2;
std::shared_ptr<A> a3 = a1 + a2;
一个完整的例子可能是
class Value
{
private:
int value;
public:
Value(int value_): value(value_)
{}
Value operator+(Value other) const
{
return Value(value + other.value);
}
};
std::shared_ptr<Value> operator+(const std::shared_ptr<Value>& a, const std::shared_ptr<Value>& b)
{
return std::make_shared<Value>(*a + *b);
}
所以你可以使用
Value a, b;
Value c = a + b;
还有
std::shared_ptr<Value> pa, pb;
std::shared_ptr<Value> pc = pa + pb;
相关文章:
- 如何在C++中从两个单独的for循环中添加两个数组
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- 如何返回一个类的两个对象相加的结果
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 两个字符串在 c++ 中不相等
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 两个文件使用彼此的功能-如何解决
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 如何确保在使用基于布尔值的两个方法之一调用方法时避免分支预测错误
- 停止cmake target_link_libraries将插件中静态库的两个对象文件链接到静态库本身
- 将fold表达式与std::一起用于两个元组
- 如何在C++中比较两个char数组
- 给定两个偶数,求出它们之间所有偶数的平方和
- 比较两个大小不等的映射c++
- 有没有更好的方法来添加两个智能指针?
- 我应该为地图中的两个智能指针对制作自己的比较器吗?
- 两个智能指针之间的引用
- 为什么sqrt()在智能感知中使用两个pow()的内部计算是错误的