我为自写类重载了operator +,进一步通过智能指针处理这些类的实例。现在,我想知道是否没有更好的方法来利用运算符。此外,我不知道如何将它们重新打包到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()
答案 0 :(得分:5)
对于“智能指针”,取消引用运算符已重载。
您应该像这样添加它们:
*a + *b
如果要与结果共享对象,则可以从中创建共享对象:
auto c = std::make_shared<A>(*a + *b);
如果您有原始指针,则可以执行以下操作:
auto c = new A(*a + *b);
相似之处不是巧合。
另一方面,除非您真的打算在多个所有者之间共享对象,否则您根本不应该使用shared_ptr
。
答案 1 :(得分:2)
是否有更好的方法添加两个智能指针?
您不能添加智能指针。您在这里所做的就是通过智能指针进行间接操作并添加指向对象。
对get()的调用是多余的。您可以直接通过智能指针间接访问:*a + *b
。
进一步,我不知道如何将它们重新打包到shared_ptr
创建共享指针的简单方法是std::make_shared
。
答案 2 :(得分:1)
您可以为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;