2

就像标题所说的那样,我正在尝试实现一个运算符^(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。请告诉我为什么会这样。如果有人能告诉我如何ONE在第 15 行创建一个常量类对象,如 Java 中的 BigInteger.ONE,我也非常感谢。

4

2 回答 2

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^是按位异或。重用它作为幂运算符将导致非常混乱的代码。

除此之外,您的代码会产生您期望的结果,因此问题一定出在其他地方。

于 2012-05-21T15:35:32.357 回答
1

如果有人能告诉我如何在第 15 行使 ONE 成为像 Java 中的 BigInteger.ONE 这样的常量类对象,我也非常感谢。

把它放在你的复杂声明中:

class Complex {
   ...
   const static Complex ONE;
};

并且,将其放在您的复杂声明之外:

const Complex Complex::ONE(1,0);

如果您将您的 Complex 声明放在一个头文件(例如 Complex.hpp)中,您应该将第二行(Complex::ONE 定义)恰好放在一个源代码文件(例如 Complex.cpp)中。

于 2012-05-21T15:43:23.320 回答