c++ - 如何用复数和多态重载运算符?

标签 c++ pointers inheritance polymorphism operator-overloading

我必须创建一个 Complex 类和一个包含复数 vector 的 vector 类。我必须在两个类中重载 +、-、/、*、<<。它们都是成员函数还是将它们作为非成员函数会更容易?另外,有没有办法让vector类只有vector作为参数,而不包括实数和虚数以及vector?下面的代码来自于我的vector类的类成员函数。

class ComplexVector : public Complex //vectors whose elements are complex numbers
{
public:
  ComplexVector(); 
  ComplexVector(double real, double imaginary, std::vector <Complex> vec); 
  ComplexVector(std::vector <Complex> vec); 
  friend ComplexVector operator+ (const ComplexVector& v1, const ComplexVector& v2);
  friend ComplexVector operator- (const ComplexVector& v1, const ComplexVector& v2);
  friend ComplexVector operator* (const ComplexVector& v1, const ComplexVector& v2);
  friend ComplexVector operator/ (const ComplexVector& v1, const ComplexVector& v2);
  int get_size() const; 

private:
  std::vector <Complex> cvec;

};
std::ostream& operator<< (std::ostream& stream, const ComplexVector& comvec); 

我把每个函数的解释放在一个单独的cpp文件里。即使我在头文件中使用了 friend ,但在 cpp 文件中它说我不允许使用两个参数。有办法摆脱它吗?此外,我是否必须使用指针才能访问 vector 中的内容?我听说过使用 vector,但我已经尝试过了,但算术对我来说没有意义。 (注意:我在玩弄所以并不是所有的代码都完全正确)谢谢!

ComplexVector::ComplexVector() : Complex() {}
ComplexVector::ComplexVector(double real, double imaginary, std::vector<Complex> vec) : Complex(real, imaginary), cvec(vec) {}
ComplexVector::ComplexVector(std::vector<Complex>vec) {cvec = vec;}
ComplexVector& ComplexVector::operator+ (ComplexVector v1, const ComplexVector& v2)
{
  std::vector <Complex> add;
  for (int i = 0; i < v1.get_size(); i++)
  {
    double xside = v1[i].get_real() + v2[i].get_real();
    double yside = v1[i].get_()imaginary + v2[i].get_imaginary();
    add[i] = Complex(xside,yside);
  }
  ComplexVector add_sol(add);
  return add_sol;
}
ComplexVector ComplexVector::operator- (const ComplexVector& v1, const ComplexVector& v2)
{
  std::vector <Complex> sub;
  for (int i= 0; i < v1.get_size(); i++)
  {
    sub[i] = v1[i] - v2[i]; //same as +?
    //does not provide subscript operator????
  }
  ComplexVector sub_sol(sub);
  return sub_sol;
}
ComplexVector ComplexVector::operator* (const ComplexVector& v2)
{
  ComplexVector multi;
  for (int i = 0; i < v1.size(); i++)
  {
    multi[i] = v1[i] * v2[i];
  }
  return multi;
}
ComplexVector operator/ (const ComplexVector& v2)
{
  ComplexVector div;
  for (int i = 0; i < v1.size(); i++)
  {
    div[i] = v1[i] / v2[i];
  }
  return div;
}
int ComplexVector::get_size() const
{
  int total;
  for (int i = 0, i < cvec.size(); i++)
  {
    total++;
  }
  return total;
}
std::ostream& ComplexVector::operator<< (std::ostream& stream, const ComplexVector& comvec)
{
  for (int i = 0; i < comvec.size(); i++)
  {
    stream << comvec[i] -> get_real() << " " << "+" << " " << comvec[i] -> get_imaginary() << "i" ;
  }
  return stream;
}

最佳答案

类中定义的运算符:

如果类声明运算符 + 如下:

class A {
public: 
    A operator+(A b);
};

这意味着 b 是第二个操作数,第一个是调用运算符的对象。换句话说,x、y 和 z 属于 A 类:

z = x + y; 

相当于:

z = x.operator+(y);  

不幸的是,以下定义中的 ComplexVector:: 表明您将运算符定义为类成员:

 ComplexVector& ComplexVector::operator+ (ComplexVector v1, const ComplexVector& v2)

问题是 operator+ 有两个操作数。在这种情况下,它将是对象本身和 v1。所以编译器会提示显式声明的第二个参数,它是 operand+ 的第三个操作数。这是非法的。

类外定义的友元运算符

如果你像这样定义一个友元运算符:

class A {
public: 
    friend A operator-(A a, A b);
};

表示运算符-不是类成员而是独立的运算符。因此,它需要两个参数才能发生操作。所以

z = a - b;

相当于

z = ::operator- (a, b);  

很遗憾,您没有在代码中使用该方法。

其他备注

您需要根据一些通用规则来声明运算符,以便它们保持自然运算符的语义。

因此,对于 +、-、* 和/,您不应该通过引用(或最终是 const 引用)获取参数,您应该始终按值返回,包括 operator+。

在这里a step by step article by Herb Sutter详细解释有关运算符重载的一些限制。这里是more advanced guideline .

最后,不想太粗鲁,让一个 complex 的 vector 从一个 complex 继承的逻辑是什么?复数的 vector 不是一种复数。这是一个完全不同的类,有依赖关系,但绝对没有正当理由继承!还是有?

关于c++ - 如何用复数和多态重载运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47127317/

相关文章:

c++ - 删除指针和将其设置为 nullptr 之间有什么区别?

ruby-on-rails - ActiveRecord多级单表继承查询

Java继承结构问题

c++ - “可变”变量只能通过一种 const 方法可变吗?

c++ - C/C++ : size of a typedef struct containing an int and enum == sizeof(int)?

c++ - 创建指向其他对象的列表指针

C - malloc 的返回值可以像数组一样使用(对齐)吗?

c++ - 为什么子类调用它父类的方法而不是它自己的?

c++ - 使用模板访问 C++ 中父类(super class)的 protected 成员

c++ - 不同编译器的枚举大小(以字节为单位)