【问题标题】:How can I pass an object, held within a vector, to an operator?如何将保存在向量中的对象传递给操作员?
【发布时间】:2012-03-26 14:21:43
【问题描述】:

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

由于每个类都是在从文件读取的循环中创建的(使用 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];

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

我意识到这完全是错误的,但我不知道最好的方法是什么。

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

【问题讨论】:

  • 在这里使用new 绝对没有意义。
  • 您是要添加一个 Complex 和另一个 Complex,还是添加一个带有 Complex 向量的 Complex?您的 main 函数调用建议前者,您的 operator 参数建议后者。

标签: c++ class vector operator-overloading


【解决方案1】:
result.real=real+v[y].real;

你从哪里得到y

您正在定义将Complexstd::vector&lt;Complex&gt; 相加。这有点奇怪。通常你会想要定义一个 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,您的问题就解决了。

【讨论】:

    猜你喜欢
    • 2012-06-02
    • 2011-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-04
    • 2018-07-17
    • 1970-01-01
    相关资源
    最近更新 更多