overloading operator * c++

╄→尐↘猪︶ㄣ 提交于 2019-12-11 19:25:27

问题


I have been trying to compile this program but it is giving me an error in regards to overloading the * operator for one of the functions: complex operator *(double n)const

When I try to compile I get the error: no match for 'operator*' in '2 * c'

Here is the header file:

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

Here is the cpp:

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;
    }

Can someone explain to me what I have done wrong?


回答1:


The member function operator only applies when the first operand is of your class type. If you want to handle the case where the second operand is of your type, you need also a free function (in which we simply delegate to the member function by virtue of commutativity of the operation):

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

(Please note that the standard library already contains <complex>.)




回答2:


You have a member function defined as follows:

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

That will let you do things like: complex_number * 3.0, but not 3.0 * complex_number. However, you can't create a member function that will let you do 3.0 * complex_number. The only place you could create that member function, is inside the definition of double, which you can't change.

Instead of doing it as member functions though, you can also do it as free-standing functions:

complex operator*(complex x, double n); // Called for complex_number * 2.0
complex operator*(double n, complex x); // Called for 2.0 * complex_number


来源:https://stackoverflow.com/questions/17708374/overloading-operator-c

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!