包含在智能指针中的类的运算符重载

时间:2015-06-03 14:17:32

标签: c++ operator-overloading smart-pointers c++14

我一直试图在智能指针包装的类上进行一些运算符重载(*和+)。

Exception in thread "LWJGL Application" java.util.ConcurrentModificationException
    at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
    at java.util.ArrayList$Itr.next(ArrayList.java:851)
    at com.dreamroad.savethetree.EnemyClass.update(EnemyClass.java:66)
    at com.dreamroad.savethetree.MyGdxGame.render(MyGdxGame.java:51)
    at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:215)
    at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:120)

Process finished with exit code 0

当我尝试使用正常重载来重载它时,它显然要求智能指针类型。

编辑,所以:

auto p = std::make_unique<Polynomial<T>>();

错误:

Error from trying to use the + operator

那么当类封装在智能指针中时,如何重载正常的运算符呢?

3 个答案:

答案 0 :(得分:11)

<强>唐&#39;吨

在指针上运行这些操作,而不是指针:

*p = *p + *p

如果突然指针有完全不同的意外语义,那么代码用户会感到非常困惑。

你也会感到困惑。

答案 1 :(得分:2)

  

那么当类封装在智能指针中时,如何重载正常的运算符呢?

只需按正常方式声明:

template<typename T>
Polynomial<T> operator*(Polynomial<T> lhs, Polynomial<T> rhs) { ... }

template<typename T>
Polynomial<T> operator+(Polynomial<T> lhs, Polynomial<T> rhs) { ... }

然后给出类似的东西:

auto p = std::make_unique<Polynomial<int>>();
auto q = std::make_unique<Polynomial<int>>();

只需致电:

auto x = (*p) * (*q);
auto y = (*q) + (*p);

Live demo

您提供的错误:

enter image description here

是由于您的运营商重载:

std::unique_ptr<Polynomial<T>> operator+(const std::unique_ptr<Polynomial<T>>& right);

正在为operator+等表达式重载一元 +x

另一个:

template<class T>
std::unique_ptr<Polynomial<T>> Polynomial<T>::operator+(const std::unique_ptr<Polynomial<T>>& right) {
    //Do stuff
}
对于operator+Polynomial<T>类型的操作数,

正在重载std::unique_ptr<Polynomial<T>>

因此,给定两个unique_ptr<Polynomial<T>>,即xy,表达式如下:

x + y

找不到operator+的重载分辨率。

我也强烈反对标准库类型的运算符重载。

答案 2 :(得分:2)

要直接回答您的问题,我同意@LightnessRacesinOrbit:只是不要。但是,写下另一个答案的原因是你问的问题对我来说听起来有点XY-problem

您有一个类Polynomial<T>,但您希望用户将其包装在智能指针中?这是可疑的,因为理智的设计只是希望用户直接使用Polynomial,因此提供直接使用该类型的普通操作符。

退一步思考为什么你认为智能指针会被使用/需要/有帮助。通常,这是出于效率假设的原因而做的,对吧?但这只是意味着你应该重新思考如何实现Polynomial本身。请看以下内容:

  • Polynomial是否有移动构造函数和-assignment?如果没有,请实施它。
  • 存储的数据怎么样?也许内部存储应该由智能指针管理。与移动语义一起,这可以带来非常高效的操作。
  • 对于运算符重载,请实施a+=b;,使用库为您生成a+b。检查Boost.Operators或我的df.operators,后者也是移动感知。

通过正确的实施,使用std::unique_ptr<Polynomial<T>>的冲动应该消失:)