在c ++中实现复数幂函数?

时间:2012-05-21 15:28:04

标签: c++ class operator-overloading

就像标题所说,我正在尝试实现一个运算符^(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之类的常量类对象,也真的很感激。

2 个答案:

答案 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)。