Addition of complex numbers using classes

孤街醉人 提交于 2020-01-15 11:37:29

问题


I am trying to add 2 complex numbers together, but i am getting the errors:

no operator "+" matches these operands

no operator "<<" matches these operands

#include <iostream>

using namespace std;


class complex
{
public:

    double get_r() { return r; }
    void set_r(double newr) { r=newr; }
    double set_i() { return i; }
    void set_i(double newi) { i = newi; }
private:
    double r, i;

};

int main()
{

complex A, B;
A.set_r(1.0);
A.set_i(2.0);
B.set_r(3.0);
B.set_i(2.0);

complex sum = A+B;
cout << "summen er: " << sum << endl;

        system("PAUSE");
return 0;
};

I'm very new to programming, but i can't see why it won't add these numbers together. What have I done wrong?


回答1:


You must overload operators + and << (and each one in your need) for your defined classes. Note that operators are no more than specific functions with specific definition syntax (operator+, for example: C = A + B could be understood as C = A.sum(B)). Here a link about http://en.cppreference.com/w/cpp/language/operators




回答2:


Operator + is defined for builtin types and for some types from the standard library. As complex is here a custom class, you must define all operators that should act on it.

operator + could be defined as:

class complex {
    ...
    complex operator + (const complex& other) {
        return complex(get_r() + other.get_r(), get_i() + other.get_i());
    }
    ...
};

Beware that does allow neither A++ nor A-B. They would require (resp.) complex & operator ++() or complex operator - (const complex &).

For stream insertion, the first parameter is the stream itself, so you must define a friend operator with 2 parameters outside the class:

outstream& opererator << (outstream &out, const complex& val) {
    // output it the way you want
    return out;
}



回答3:


Complex numbers are part of the C++ standard. Here is the example from http://en.cppreference.com/w/cpp/numeric/complex.

#include <iostream>
#include <iomanip>
#include <complex>
#include <cmath>

int main()
{
    using namespace std::complex_literals;
    std::cout << std::fixed << std::setprecision(1);

    std::complex<double> z1 = 1i * 1i;
    std::cout << "i * i = " << z1 << '\n';

    std::complex<double> z2 = std::pow(1i, 2);
    std::cout << "pow(i, 2) = " << z2 << '\n';

    double PI = std::acos(-1);
    std::complex<double> z3 = std::exp(1i * PI);
    std::cout << "exp(i * pi) = " << z3 << '\n';

    std::complex<double> z4 = 1. + 2i, z5 = 1. - 2i;
    std::cout << "(1+2i)*(1-2i) = " << z4*z5 << '\n';
}

Trying to implement a class complex yourself would require you define addition, equality, and ostream. And you would only have 5% of a fully implemented class. Looking at the header itself will reveal how those that wrote the C++ standard library implemented the whole thing.




回答4:


All the arithmetic operators like plus, minus, multiply or divide only work with pre defined data types, like int, char, float etc.

Now if you want to add something in a class, you have to use the fundamental aspect of OO programming that is operator overloading.

Here is how you can achieve it.

#include <iostream>
using namespace std;

class complex
{
    float x, y;
public:
    complex()
    {

    }

    complex(float real, float img)
    {
        x = real;
        y = img;
    }

friend complex operator+(complex,complex);
    void display(void);
};

complex operator+(complex c,complex d)
{
    complex t;
    t.x = d.x + c.x;
    t.y = d.y + t.y;
    return(t);
};

void complex::display(void)
{
    cout << x << "+i" << y << endl;
}




int main()
{
    complex c1, c2, c3;
    c1 = complex(2.5, 3.5);
    c2 = complex(1.5, 5.5);
    c3 = c1 + c2;//c3=opra+(c1,c2)
    cout << "C1:" << endl;
    c1.display();
    cout << "C2:" << endl;
    c2.display();
    cout << "C3:" << endl;
    c3.display();
}


来源:https://stackoverflow.com/questions/42833241/addition-of-complex-numbers-using-classes

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