我的作业要求我使用二元运算符来处理类中保存的复数。
当在从文件读取的循环中创建(使用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
答案 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
,你的问题就解决了。