我必须创建一个 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/