如何将矢量中保存的对象传递给操作员?

时间:2012-03-26 14:21:43

标签: c++ class vector operator-overloading

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

当在从文件读取的循环中创建(使用new)每个类时,为了能够引用它们,我将它们存储在向量中(使用回推)。

当前功能定义:

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];

我在网上找到的所有内容都依赖于具有已知名称的类,因此您可以发送指针。我希望能够选择在运行时使用哪个类,这样我就无法给出一个set vector成员。

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

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

1 个答案:

答案 0 :(得分:0)

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

你从哪里得到y

您正在定义Complex添加std::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),然后就可以对基类的集合进行操作指针。

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