2

タイトルが言ったように、複素数を n 乗して計算する operator^(int 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::pow特殊化を持つstd::complexテンプレート型があることをご存知ですか?

#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^XOR です。これを累乗演算子として再利用すると、非常に紛らわしいコードになります。

それ以外では、コードは期待どおりの結果を生成するため、問題は別の場所にあるに違いありません。

于 2012-05-21T15:35:32.357 に答える
1

また、15 行目の ONE を Java の BigInteger.ONE のような定数クラス オブジェクトにする方法を教えていただければ、本当に感謝しています。

これを Complex 宣言の中に入れます。

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

そして、これを Complex 宣言の外に置きます。

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

Complex 宣言をヘッダー ファイル (Complex.hpp など) 内に配置する場合は、2 行目 (Complex::ONE 定義) を1 つのソース コード ファイル (Complex.cpp など) 内に配置する必要があります。

于 2012-05-21T15:43:23.320 に答える