2013-07-17 14 views
0

Я пытался скомпилировать эту программу, но она дает мне ошибку относительно перегрузки оператора * для одной из функций: комплексного оператор * (двойная п) сопзЬперегрузка оператор * C++

Когда Я пытаюсь скомпилировать я получаю ошибку: не подходит для 'оператора *' в '2 * с'

Здесь пока файл заголовка:

complex.h

#ifndef COMPLEX0_H 
#define COMPLEX0_H 

class complex { 
    double realNum; 
    double imagNum; 
public: 
    complex(); 
    complex(double x,double y); 
    complex operator *(double n)const; 
    complex operator *(const complex &c1)const; 
    friend std::istream &operator>>(std::istream &is,complex &cm); 
    friend std::ostream &operator<<(std::ostream &os,const complex &cm); 
}; 

#endif 

Вот каст:

Complex.cpp

#include "iostream" 
#include "complex0.h" 

complex::complex() { 
    imagNum = 0.0; 
    realNum = 0.0; 
} 

complex::complex(double x, double y) { 

    realNum = x; 
    imagNum = y; 
} 

complex complex::operator *(const complex& c1) const{ 
complex sum; 
sum.realNum=realNum*c1.realNum-c1.imagNum*imagNum; 
sum.imagNum=realNum*c1.imagNum+imagNum*c1.realNum; 
    return sum; 
} 

complex complex::operator *(double n)const{ 
    complex sum; 
    sum.realNum=realNum*n; 
    sum.imagNum=imagNum*n; 
    return sum; 

} 
std::istream &operator >>(std::istream& is, complex& cm) { 
    is >> cm.realNum>> cm.imagNum; 
    return is; 
} 

std::ostream &operator <<(std::ostream& os, const complex& cm){ 
os<<"("<<cm.realNum<<","<<cm.imagNum<<"i)"<<"\n";  
return os; 
} 

main.cpp

#include <iostream> 
using namespace std; 
#include "complex0.h" 

    int main() { 
     complex a(3.0, 4.0); 
     complex c; 
     cout << "Enter a complex number (q to quit):\n"; 
     while (cin >> c) { 
      cout << "c is " << c << "\n"; 
      cout << "a is " << a << "\n"; 
      cout << "a * c" << a * c << "\n"; 
      cout << "2 * c" << 2 * c << "\n"; 
      cout << "Enter a complex number (q to quit):\n"; 
     } 
     cout << "Done!\n"; 
     return 0; 
    } 

Может кто-нибудь объяснить мне, что я сделал не так?

+1

Потому что вы только взять 'complex' на левой стороне, и не в два раза. – chris

+0

Ошибка, которую я получаю: нет соответствия для 'operator *' в '2 * c' – jis

+0

@chris, что вы имеете в виду. – jis

ответ

3

Оператор функции-члена применяется только в том случае, если операнд имеет тип вашего класса. Если вы хотите, чтобы обрабатывать случай, когда второго операнда является вашим типа, необходимо также свободную функция (в которой мы просто делегировать функции члена в силе коммутативности операции):

complex operator*(double n, complex const & x) 
{ 
    return x * n; 
} 

(Обратите внимание, что стандартная библиотека уже содержит <complex>.)

+0

Спасибо. Оно работает. – jis

0

у вас есть функция-член определяется следующим образом:

complex complex::operator *(double n) const; 

Это позволит вам делать такие вещи, как: complex_number * 3.0, но не 3.0 * complex_number. Однако вы не можете создать функцию-член, которая позволит вам делать 3.0 * complex_number. Единственное место, где вы могли бы создать эту функцию-член, находится внутри определения double, которое вы не можете изменить.

Вместо того, чтобы делать это в качестве функции члена, хотя, вы также можете сделать это, как свободно стоящие функции:

complex operator*(complex x, double n); // Called for complex_number * 2.0 
complex operator*(double n, complex x); // Called for 2.0 * complex_number 
Смежные вопросы