如何将向量中的对象传递给操作符
How can I pass an object, held within a vector, to an operator?
我的作业要求我使用二进制运算符来处理类中的复数。
由于每个类都是在从文件读取的循环中创建的(使用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
?
您正在定义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
),然后可以对基类指针的集合进行操作。
为了提供进一步的指导,应该显示更多的代码。但是,如果您所要做的只是使用运算符+对存储在向量中的数字类型的实例求和,那么从STL中检出std::accumulate
,问题就解决了。
- 在重载的全局new操作符中使用静态对象会导致核心转储运行时错误
- 如何将向量中的对象传递给操作符
- sizeof操作符是否优先选择对象而不是类型
- 试图创建对象列表,操作符=给了我麻烦
- 用模板对象重载容器类的操作符[]
- 我如何使用“函数调用操作符”来加载“右值”类型到我的对象
- 重载操作符以处理类对象
- 对象文件中的ostream操作符发生了什么?
- 操作符new在异常后销毁初始化的对象
- c++中带整数和对象的操作符重载
- 用户定义对象的重载操作符==
- c++模板赋值操作符重载——赋基本类型给对象
- 如果new操作符重载且构造函数为私有,则无法通过new创建对象
- std::transform中的二元操作符,带unique_ptr的vector对象
- c++操作符=类成员中有互斥对象
- 只写对象的链接操作符= - OK返回rhs而不是*this
- 如何使用new操作符创建对象并使用for循环
- 当有额外的括号时,在临时对象上调用用户定义的操作符+出错
- 操作符+没有返回完整对象
- 使用new操作符在不知道对象类型的情况下将其复制到堆中