就像标题所说,我正在尝试实现一个运算符^(int n),它将计算第n个幂的复数。我知道this
是一个指向当前类对象的指针,所以我想出了这段代码:
class Complex{
protected:
float a,b;
public:
Complex() {a=0;b=0;}
Complex(float x, float y){a=x;b=y;}
void set(float x, float y){a=x;b=y;}
Complex operator*(Complex C){
Complex temp;
temp.a=a*C.a-b*C.b;
temp.b=a*C.b+b*C.a;
return temp;
}
Complex operator^(int n){
Complex ONE=Complex(1,0);
if (n<=0) return ONE;
return ((*this)*((*this)^(n-1)));
}
void Display(){
cout<<a<<' '<<b<<endl;
}
};
int main() {
Complex C;
C.set(2,0);
C=C^3;
C.Display();
}
C.Display()应该打印8 0
但是当我在eclipse中运行它时会显示2 0
。请告诉我为什么会这样。如果有人能告诉我如何在第15行使ONE
成为Java中的BigInteger.ONE之类的常量类对象,也真的很感激。
答案 0 :(得分:3)
您是否知道有std::complex模板类型,并且有自己的std::pow专业化版本?
#include <complex>
#include <iostream>
int main() {
std::complex<double> c(2,0);
std::complex<double> c3 = pow(c, 3);
std::cout << c3 << "\n";
}
产生
(8,0)
此外,operator^
是按位异或。将其重新用作幂运算符将导致代码非常混乱。
除此之外,您的代码会产生您期望的结果,因此问题必须存在于其他地方。
答案 1 :(得分:1)
如果有人能告诉我如何在第15行创建一个像Java中的BigInteger.ONE这样的常量类对象,也非常感激。
将它放在您的复杂声明中:
class Complex {
...
const static Complex ONE;
};
并且,将它放在您的复杂声明之外:
const Complex Complex::ONE(1,0);
如果将复杂声明放在头文件(例如Complex.hpp)中,则应该在内部的第二行(Complex :: ONE定义)中只有一个源代码文件(例如Complex.cpp)。