如何将向量中的对象传递给操作符

How can I pass an object, held within a vector, to an operator?

本文关键字:操作符 对象 向量      更新时间:2023-10-16

我的作业要求我使用二进制运算符来处理类中的复数。

由于每个类都是在从文件读取的循环中创建的(使用new),为了能够重新定义它们,我将它们存储在一个向量中(使用pushback)。

当前功能定义:

Complex Complex::operator+ (vector<Complex> &v) 
{
result= new Complex;
result.real=real+v[y].real;
result.imaginary=imaginary+v[y].imaginary;
return result;
}

当前类别定义:

Complex operator+ (vector<Complex> &v);

在主函数中由调用:结果=v[x]+v[y];

我在网上找到的所有东西都依赖于具有已知名称的类,因此您可以发送指针。我希望能够选择在运行时使用哪个类,这样我就不能给出集合向量成员。

我意识到这一切都是非常错误的,但我不知道最好的方法是什么

任何帮助都会很棒!:)Hx

result.real=real+v[y].real;

你从哪里得到y

您正在定义Complexstd::vector<Complex>的相加。这有点奇怪。通常,您希望定义Complex+Complex重载,并在该类型的变量(例如,您可能对数组/向量进行索引/访问)上使用该重载(仅当它是明显的或数学定义的且明确的时,作为语法上的便利)。您当前定义的行为不应该在运算符重载中,而应该只是一个普通函数。

使用new是不必要的,并且会导致内存泄漏,因为没有相应的delete,因此堆中的内存地址不会被释放。您应该将其初始化为一个常规堆栈变量:

Complex result;

无论何时,都倾向于堆栈分配而不是堆分配;它不仅避免了内存问题,而且速度更快。

无论哪种方式,这个变量都是一个临时变量,有两个副本;一个在返回上,另一个在push_back上的向量内。

就你的问题而言,我认为你想要的是有一些聚合类,它对不同的数字类型进行操作,并利用运算符重载。

您可以使用模板将聚合类定义为模板化类,然后用数字类型(例如Complex)实例化它(只需确保它们定义了operator+()),然后在类中的某些函数中,您可以在模板化变量上使用+重载:

template <typename T>
class MyNumericAggregatorClass
//... in some function
// T a; T b;
T result = a + b;
//...

另一种选择是使用多态性创建一个具有virtual operator+()的基类,以及覆盖该运算符的子类(例如Complex),然后可以对基类指针的集合进行操作。

为了提供进一步的指导,应该显示更多的代码。但是,如果您所要做的只是使用运算符+对存储在向量中的数字类型的实例求和,那么从STL中检出std::accumulate,问题就解决了。