简体   繁体   中英

Addition of complex numbers using classes

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?

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

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

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.

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM