2012-05-21 3 views
1

Как и в названии, я пытаюсь реализовать оператор^(int n), который будет вычислять комплексное число до n-й степени. Я знаю, что this является указателем, который указывает на текущий объект класса, так что я придумал этот код:реализация комплексной функции мощности числа в C++?

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 но когда я побежал в затмить его отображения 2 0. Пожалуйста, скажите мне, почему это происходит. Также очень признателен, если кто-нибудь может сказать мне, как сделать ONE в строке 15 объектом постоянного класса, таким как BigInteger.ONE в Java.

+9

Даже если это заманчиво - пожалуйста, не используйте '^' в качестве силового оператора в C++, он имеет неправильный приоритет. – leftaroundabout

+0

Что говорит отладчик? – zmbq

+2

Что случилось с 'std :: complex' и' std :: pow'? – Fanael

ответ

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^ является побитовое исключающее ИЛИ. Повторное использование этого в качестве оператора питания приведет к очень запутанному коду.

Кроме этого, ваш код дает ожидаемый результат, поэтому проблема должна лежать в другом месте.

+0

Не нужно квалифицировать 'pow' с' std :: ', потому что ADL найдет нужную функцию. –

+0

@BenVoigt правильный, спасибо. – juanchopanza

+0

Да, я искал, но мне НУЖНО реализовать оператор^для этой домашней работы – minhnhat93

1

Также очень важно, чтобы кто-нибудь мог сказать мне, как сделать ONE в строке 15 объектом постоянного класса, таким как BigInteger.ONE в Java.

Put это внутри комплекса декларации:

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

И поставить это за пределами комплекса декларации:

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

Если поместить Комплексе декларацию в заголовочном файле (например, Complex .hpp), вы должны 2-й строке (определение Complex :: ONE) внутри точно один файл исходного кода (например, Complex.cpp).

+0

За пределами Сложной декларации - но не в (включенном несколько раз) заголовке ... – Griwes

+0

Это убивает оптимизацию, хотя ... поэтому не рекомендуется. Лучше 'class Complex {/*...*/ public: static Complex ONE() {return Complex (1,0); }} '; который будет отстроен и оптимизирован. –

+0

благодарит Роб: D, но не могли бы вы рассказать мне, почему нам нужно писать 'const static', а не' const' только? – minhnhat93

Смежные вопросы