how to add three objects of same class in c++? [duplicate] - c++

This question already has answers here:
What are the basic rules and idioms for operator overloading?
(8 answers)
Closed 5 years ago.
can i add three objects using operator overloading in c++??
#include <iostream>
#include <conio.h>
using namespace std;
class complex{
private:
int a;
public:
void setdata(int x){
a=x;
}
void showdata(){
cout<<"\n"<<a;
}
int operator +(complex c,complex d){
complex temp;
temp.a=a+c.a+c+d.a;
return (temp);
}
};
int main(){
complex c1,c2,c3,c4;
c1.setdata(3);
c2.setdata(5);
c4.setdata(2);
c4=c1+c2+c3;
c4.showdata();
}
i am using this approach but it is not working please help.

you have to change a little the operator and you have a mistake in the inizialization of the variables (C3 is not initialized).
You have not to define an operator that works on three terms at the same time. The sum will be split in two parts (c1 + c2) + c3; the first sum returns a 'complex' item that is added to c3. The result of this last sum is assigned to c4.
See below the code.
#include <iostream>
#include <conio.h>
using namespace std;
class complex{
private:
int a;
public:
void setdata(int x){
a = x;
}
void showdata(){
cout << "\n" << a;
}
complex operator +(complex c){
complex temp;
int i = 0;
i = a + c.a;
temp.setdata(i);
return temp;
}
};
int main(){
complex c1, c2, c3, c4;
c1.setdata(3);
c2.setdata(5);
c3.setdata(2);
c4 = c1 + c2 + c3;
c4.showdata();
}

In my comments, I suggested two alternative solutions but while fiddling around with the sample code I even found a third one.
The sample code:
#include <iostream>
// Version 1: (return type fixed)
class Complex1 {
friend std::ostream& operator << (std::ostream &out, const Complex1 &c);
private:
int a;
public:
explicit Complex1(int a): a(a) { }
// operator + as member
Complex1 operator + (const Complex1 &c) const
{
return Complex1(a + c.a);
}
};
std::ostream& operator << (std::ostream &out, const Complex1 &c)
{
return out << c.a;
}
// Version 2: (two overloaded operators)
class Complex2 {
friend std::ostream& operator << (std::ostream &out, const Complex2 &c);
friend int operator+(const Complex2 &c, const Complex2 &d);
friend int operator+(int c, const Complex2 &d);
private:
int a;
public:
explicit Complex2(int a): a(a) { }
};
std::ostream& operator << (std::ostream &out, const Complex2 &c)
{
return out << c.a;
}
int operator+(const Complex2 &c, const Complex2 &d)
{
return c.a + d.a;
}
int operator+(int c, const Complex2 &d)
{
return c + d.a;
}
// Version 3: (implicit conversion with constructor)
class Complex3 {
friend std::ostream& operator << (std::ostream &out, const Complex3 &c);
private:
int a;
public:
Complex3(int a): a(a) { }
// operator + as member
int operator+(const Complex3 &c) const
{
return a + c.a;
}
};
std::ostream& operator << (std::ostream &out, const Complex3 &c)
{
return out << c.a;
}
// Check everything out:
using namespace std;
int main()
{
cout << "Version 1:" << endl;
{ Complex1 c1(3), c2(5), c3(2);
Complex1 c4 = c1 + c2 + c3;
cout << "c4: " << c4 << endl;
}
cout << "Version 2:" << endl;
{ Complex2 c1(3), c2(5), c3(2);
Complex2 c4 = Complex2(c1 + c2 + c3);
cout << "c4: " << c4 << endl;
}
cout << "Version 3:" << endl;
{ Complex1 c1(3), c2(5), c3(2);
Complex1 c4 = c1 + c2 + c3;
cout << "c4: " << c4 << endl;
}
cout << "done." << endl;
return 0;
}
You may compile and run the code on ideone.
Complex1 provides a fixed operator as member
Complex1 Complex1::operator + (const Complex1 &c) const;
Hence, (c1 + c2) + c3 is
(Complex1 × Complex1 → Complex1) &times Complex1 → Complex1
Complex2 provides two overloaded operators as non-members
int operator+(const Complex2 &c, const Complex2 &d);
int operator+(int c, const Complex2 &d);
Hence, c1 + c2 is
Complex2 × Complex2 → int
and (c1 + c2) + c3 is
int × Complex2 → int
Complex3 is very similar like the original sample with the essential difference that I provided a non-explicit constructor which accepts an int. This means the compiler will use it as conversion operator when necessary.
(With a proper constructor, the operator issue probably hadn't been noticed soon.)
Thus, c1 + c2 is
Complex3 × Complex3 → int
and (c1 + c2) + c3 is
(int → Complex3) × Complex3 → int

Related

I need help overloading these operators

I'm new to programming and I have to Overload the += operator , + Operator and ++ post and prefix operator so the following operations work properly but I'm stuck.
Here is the number class:
#include <iostream>
class Number
{
private:
int m_value;
public:
Number(int value = 0);
std::ostream& print(std::ostream& ostr = std::cout)const;
};
std::ostream& operator<<(std::ostream& ostr, const Number& N);
using namespace std;
void prn(const Number& a, const Number& b, const Number& c)
{
cout << "c a b " << endl
<< c << " " << a << " " << b << endl;
cout << "--------------------" << endl;
}
int main()
{
Number a{ 10 }, b{ 20 }, c;
c = a + b;
prn(a, b, c);
c = ++a;
prn(a, b, c);
c = a += b;
prn(a, b, c);
c = b++;
prn(a, b, c);
return 0;
}
/// output:
/*
c a b
30 10 20
--------------------
c a b
11 11 20
--------------------
c a b
31 31 20
--------------------
c a b
20 31 21
----------------
The below program shows how to overload different operator correctly.
#include <iostream>
class Number
{
//overload operator+ so that we can add two Number objects
friend Number operator+(const Number &lhs, const Number &rhs);
//overload operator<< so that we can use std::cout<< c
friend std::ostream& operator<<(std::ostream &os, const Number& num);
int m_value = 0;
public:
Number(int value = 0);
//overload operator+= . This operator will be used inside operator+ definition
Number& operator+=(const Number &rhs);
Number& operator++();
Number operator++(int);
};
Number::Number(int value): m_value(value)
{
}
Number operator+(const Number &lhs, const Number &rhs)
{
Number sum = lhs; // copy data members from lhs into sum
sum += rhs; // add rhs into sum using compound operator
return sum;
}
Number& Number::operator+=(const Number &rhs)
{
m_value += rhs.m_value;
return *this;
}
std::ostream& operator<<(std::ostream &os, const Number& num)
{
os << num.m_value;
return os;
}
Number& Number::operator++()
{
++m_value;
return *this;
}
Number Number::operator++(int)
{
Number old = *this; // copy old value
operator++(); // prefix increment
return old; // return old value
}
void prn(const Number& a, const Number& b, const Number& c)
{
std::cout << "c a b " << std::endl
<< c << " " << a << " " << b << std::endl;
std::cout << "--------------------" << std::endl;
}
int main()
{
Number a{ 10 }, b{ 20 }, c;
c = a + b;
prn(a, b, c);
c = ++a;
prn(a, b, c);
c = a += b;
prn(a, b, c);
c = b++;
prn(a, b, c);
return 0;
}
Now you'll get your desired output as can be seen here.
c a b
30 10 20
--------------------
c a b
11 11 20
--------------------
c a b
31 31 20
--------------------
c a b
20 31 21
--------------------

Sum of squares complex numbers in descending order

I would like to calculate the sum of squares complex numbers in descending order by using three source codes(Complex2.h, Complex2.cpp, Vector3)
ex) (5+6i)^2 (3+4i)^2 (1+2i)^2....
I'm trying to add and change some codes in Vector3 to get the result, but stuck in the middle now..
Does anyone give some advice?
//Complex2.h
#ifndef COMPLEX2_H_INCLUDED
#define COMPLEX2_H_INCLUDED
#include <ostream>
using namespace std;
class Complex2 {
double rPart, iPart; // real part and imaginary part
public:
// operator
Complex2(double r = 0, double i = 0) : rPart(r), iPart(i) {}
Complex2 conj() const {
return Complex2(rPart, -iPart);
}
Complex2 operator+(const Complex2 &c) const;
Complex2 operator+(double r) const;
Complex2 operator-(const Complex2 &c) const;
Complex2 operator-(double r) const;
Complex2 operator*(const Complex2 &c) const;
Complex2 operator*(double r) const;
Complex2 operator/(const Complex2 &c) const;
Complex2 operator/(double r) const;
Complex2& operator+=(const Complex2 &c);
Complex2& operator-=(const Complex2 &c);
Complex2& operator*=(const Complex2 &c);
Complex2& operator/=(const Complex2 &c);
bool operator==(const Complex2 &c) const;
bool operator!=(const Complex2 &c) const;
double real() const { return rPart; }
double imag() const { return iPart; }
void display() const; // print complex value
friend Complex2 operator+(double r, const Complex2& c);
friend ostream& operator<<(ostream& os, const Complex2& c);
};
#endif
//Complex2.cpp
#include <iostream>
#include "Complex2.h"
using namespace std;
Complex2 Complex2::operator+(const Complex2 &c) const
{
return Complex2(rPart + c.rPart, iPart + c.iPart);
}
Complex2 Complex2::operator+(double r) const
{
return Complex2(rPart + r, iPart);
}
Complex2 Complex2::operator-(const Complex2 &c) const
{
return Complex2(rPart - c.rPart, iPart - c.iPart);
}
Complex2 Complex2::operator-(double r) const
{
return Complex2(rPart - r, iPart);
}
Complex2 Complex2::operator*(const Complex2 &c) const
{
return Complex2(rPart * c.rPart - iPart * c.iPart, rPart * c.iPart + iPart * c.rPart);
}
Complex2 Complex2::operator*(double r) const
{
return Complex2(rPart * r, iPart * r);
}
Complex2 Complex2::operator/(const Complex2 &c) const
{
double d = c.rPart * c.rPart + c.iPart * c.iPart;
return Complex2((rPart * c.rPart + iPart * c.iPart) / d, (iPart * c.rPart - rPart * c.iPart) / d);
}
Complex2 Complex2::operator/(double r) const
{
return Complex2(rPart / r, iPart / r);
}
Complex2& Complex2::operator+=(const Complex2 &c)
{
rPart += c.rPart; iPart += c.iPart;
return *this;
}
Complex2& Complex2::operator-=(const Complex2 &c)
{
rPart -= c.rPart; iPart -= c.iPart;
return *this;
}
Complex2& Complex2::operator*=(const Complex2 &c)
{
*this = *this * c;
return *this;
}
Complex2& Complex2::operator/=(const Complex2 &c)
{
*this = *this / c;
return *this;
}
bool Complex2::operator==(const Complex2 &c) const
{
return rPart == c.rPart && iPart == c.iPart;
}
bool Complex2::operator!=(const Complex2 &c) const
{
return rPart != c.rPart || iPart != c.iPart;
}
void Complex2::display() const
{
cout << "(" << rPart;
if (iPart > 0)
cout << "+j" << iPart;
else if (iPart < 0)
cout << "-j" << -iPart;
cout << ")";
}
Complex2 operator+(double r, const Complex2& c)
{
return Complex2(r + c.rPart, c.iPart);
}
ostream& operator<<(ostream& os, const Complex2& c)
{
os << "(" << c.rPart; // print real part
if (c.iPart > 0) // print imaginary part
os << "+j" << c.iPart;
else if (c.iPart < 0)
os << "-j" << -c.iPart;
cout << ")";
return os;
}
//Vector3.cpp
#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
#include <algorithm>
#include "Complex2.h";
using namespace std;
template<typename T> struct GREATER {
bool operator()(const T& a, const T& b) const {
return a > b;
}
};
int main()
{
srand((unsigned)time(NULL)); // Initialize random number generation
vector<Complex2> cv1(5);
cout << "vector1 : ";
for (auto &c : cv1) {
c = rand() % 100; // 0~99 random number generation
cout << c << " ";
}
sort(cv1.begin(), cv1.end(), GREATER<int>()); // sort algorithm in descending
cout << endl << "sorted vector1 : ";
for (auto c : cv1)
cout << c << " ";
cout << endl << endl;
vector<Complex2> cv2(5);
cout << "vector2 : ";
for (auto &c : cv2) {
c = rand() % 100; // 0~99 random number generation
cout << c << " ";
}
sort(cv2.begin(), cv2.end(), GREATER<int>()); // sort algorithm in descending
cout << endl << "sorted vector2 : ";
for (auto c : cv2)
cout << c << " ";
cout << endl << endl;
// vector for saving the merged result
vector<Complex2> cv3(cv1.size() + cv2.size());
// Save the result cv1 plus cv2 as cv3
merge(cv1.begin(), cv1.end(),
cv2.begin(), cv2.end(), cv3.begin(), GREATER<int>());
cout << "the result of merged vector1 and vector2 : ";
for (auto c : cv3)
cout << c << " ";
cout << endl << endl;
return 0;
}
To do this, all you actually need is to define operator>:
bool Complex2::operator>(const Complex2 &c) const
{
return rPart * rPart + iPart * iPart > c.rPart * c.rPart + c.iPart * c.iPart;
}
Then you can call std::sort and std::merge with:
std::sort(cv1.begin(), cv1.end(), std::greater<Complex2>());
std::merge(cv1.begin(), cv1.end(), cv2.begin(), cv2.end(),
cv3.begin(), std::greater<Complex2>());
Side note: why not use std::complex?
One thing which is very important here:
It is impossible to order complex numbers!!!
You are talking about ordering them, and you seem to be looking for some ordering function, but you need to know that, whatever the means of ordering complex numbers, the ordering must satisfy following argument:
Order(Number1, Number2) AND Order(Number2, Number3) => Order(Number1, Number3)
This expression can't be true, for any kind of ordering you might be inventing (at least for complex numbers, for real numbers ordering is simple), so your question about "descending order" of complex numbers cannot make sense.
The whole explanation can be found here.

Why does my C++ iostream overload failed when called in more complex cin and cout?

Having trouble with the overloaded IOstream in my C++ class, the code below is my header file, so there is no main(). The overloaded iostream seems to work with simple cin and cout calls, but when put into more complex ones, it throws no match for operato<< and operator>>.
/*
Provide three constructors Complex(a, b), Complex(a), and Complex(). Complex()
creates a Complex object for number 0 and Complex(a) creates a Complex object with 0 for b.
Also provide the getRealPart() and getImaginaryPart() functions for returning
the real and imaginary part of the complex number, respectively.
*/
/*
Overload the operators +, -, *, /, +=, -=, *=, /=, [ ], unary + and -, prefix ++ and --,
postfix ++ and --, <<, >>. Overload the operators +, -, *, / as nonmember functions.
*/
#include <iostream>
#include <sstream>
#include <string>
#include <algorithm>
using namespace std;
class Complex{
public:
Complex();
Complex(double a);
Complex(double a, double b);
void set_I(double input);
void set_R(double input);
double get_I_comp() const; //I accessor
double get_R_comp() const; // double accessor
double getRealPart();
double getImaginaryPart();
Complex operator+(Complex other);
Complex operator+(double other);
Complex operator-(Complex other);
Complex operator-(double other);
Complex operator*(Complex other);
Complex operator*(double other);
Complex operator/(Complex other);
Complex operator/(double other);
void operator++();
Complex& operator++(int dummy);
void operator+=(Complex other);
void operator+=(double other);
void operator-=(Complex other);
void operator-=(double other);
void operator*=(double other);
void operator*=(const Complex& other);
void operator/=(double other);
void operator/=(const Complex& other);
void operator- ();
void operator+ ();
double& operator[](int index);
Complex& operator<<(const int& intput);
Complex& operator>>(const string& output);
friend ostream& operator<<(ostream& out, Complex& target);
friend istream& operator>>(const istream& input, Complex& target);
std::string toString() //temporary solution right now
{
if (this->c_I != 0){
string ret = std::to_string(c_R);
ret = ret + " + ";
ret = ret + std::to_string(c_I);
ret = ret + " i \n";
return ret;
}
else{
string ret = std::to_string(c_R);
return ret;
}
}
Complex& add(double num);
Complex& add(Complex other);
Complex& subtract(double num);
Complex& subtract(Complex other);
Complex& multiply(double num);
Complex& multiply(Complex other);
Complex& divide(double num);
Complex& divide(Complex other);
Complex& abs();
private:
double c_I;
double c_R;
};
Complex::Complex() : c_I(0),c_R(0){ //works
}
Complex::Complex(double a) :c_I(0),c_R(a){ //works
}
Complex::Complex(double a, double b){ //works // at first I have the i as a and r as b, so thats why is fliped
this->c_I = b;
this->c_R = a;
}
double Complex::get_I_comp() const{
return c_I;
}
double Complex::get_R_comp() const{
return c_R;
}
double Complex::getImaginaryPart(){
return c_I;
}
double Complex::getRealPart(){
return c_R;
}
void Complex::set_I(double input){
c_I = input;
}
void Complex::set_R(double input){
c_R = input;
}
Complex Complex::operator+(Complex other){
Complex ret( (this->c_R + other.get_R_comp() ),(this->c_I + other.get_I_comp()));
return (ret);
}
Complex Complex::operator+(double other){
Complex ret(this->c_R + other,this->c_I);
return ret;
}
Complex Complex::operator-(Complex other){
Complex ret(this->c_R - other.get_R_comp(),this->c_I - other.get_I_comp());
return ret;
}
Complex Complex::operator-(double other){
Complex ret(this->c_R - other,this->c_I);
return ret;
}
Complex Complex::operator*(double other){
Complex ret(this->c_R * other ,this->c_I *other);
return ret;
}
Complex Complex::operator*(Complex other){
if((other.get_I_comp() != 0) && (other.get_R_comp() != 0) ){
Complex ret = other * (this->c_R);
Complex neu(-(other.get_I_comp()*this->c_I),other.get_R_comp()*this->c_I);
return (ret + neu);
}
if((other.get_I_comp() == 0 ) && (other.get_R_comp() != 0)){
Complex ret(this->c_R,this->c_I);
ret = ret * other.get_R_comp();
return ret;
}
else{
Complex ret((-((this->c_I)*other.get_I_comp())),(this->c_R)*other.get_I_comp());
return ret;
}
}
Complex Complex::operator/(double other){
if (other == 0) { // zero division error handler
throw runtime_error("Math error: Can't div by zero\n");
return 1;
}
if(other != 0){
Complex ret(this->c_R/other,this->c_I/other);
return ret;
}
}
//To divide a+bi by c+id we will perform the operation (ac+bd)/(c^2 + d^2) + (bc-ad)/(c^2 + d^2)i.
Complex Complex::operator/(Complex other){
if ((other.get_I_comp() != 0) && (other.get_R_comp() != 0)){
double first = ((this->c_R)*other.get_R_comp() + (this->c_I)*other.get_I_comp())/(other.get_R_comp()*other.get_R_comp() + other.get_R_comp()*other.get_R_comp());
double second = (this->c_I*other.get_R_comp() + c_R*other.get_I_comp())/(other.get_R_comp()*other.get_R_comp() + other.get_I_comp()*other.get_I_comp());
Complex ret(first,second);
return ret;
}
if((other.get_I_comp() == 0 ) && (other.get_R_comp() != 0)){
Complex ret(this->c_R,this->c_I);
ret = ret *(1/other.get_R_comp());
return ret;
}
else{
Complex ret(this->c_R,this->c_I);
Complex neu(1/other.get_I_comp());
ret = ret * neu;
return ret;
}
}
void Complex::operator++(){
c_R++;
}
Complex& Complex::operator++(int dummy){
Complex temp = *this;
++temp;
c_R++;
return temp;
}
void Complex::operator+=(double other){
c_R += other;
}
void Complex::operator+=(Complex other){
c_R += other.get_R_comp();
c_I += other.get_I_comp();
}
void Complex::operator-=(double other){
c_R +=(-1*other);
}
void Complex::operator-=(Complex other){
c_R -= other.get_R_comp();
c_I -= other.get_I_comp();
}
void Complex::operator*=(double other){
Complex& reference = *this; //pass by reference editing
reference = reference* other;
}
void Complex::operator*=(const Complex& rhs){
Complex& reference = *this;
reference = reference * rhs;
}
void Complex::operator/=(double other){
Complex& reference = *this;
reference = reference / other;
}
void Complex::operator/=(const Complex& rhs){
Complex& reference = *this;
reference = reference / rhs;
}
double& Complex::operator[](int index){
if(index <= 1){
return(index == 0 ? c_R : c_I);
}
else{
throw std::out_of_range ("index outta bound");
}
}
void Complex::operator-(){
c_R*=(-1);
c_I*=(-1);
}
void Complex::operator+(){
if(c_R<0){
c_R*=(-1);
}
if(c_I<0){
c_I*=(-1);
}
}
Complex& Complex::add(double num){
Complex& reference = *this;
reference = reference + num;
return reference;
}
Complex& Complex::add(Complex other){
Complex& reference = *this;
reference = reference + other;
return reference;
}
Complex& Complex::subtract(double num){
Complex& reference = *this;
reference = reference - num;
return reference;
}
Complex& Complex::subtract(Complex other){
Complex& reference = *this;
reference = reference - other;
return reference;
}
Complex& Complex::multiply(double num){
Complex& reference = *this;
reference = reference*num;
return reference;
}
Complex& Complex::multiply(Complex other){
Complex& reference = *this;
reference = reference * other;
return reference;
}
Complex& Complex::divide(double num){
Complex& reference = *this;
reference = reference/num;
return reference;
}
Complex& Complex::divide(Complex other){
Complex& reference = *this;
reference = reference/other;
return reference;
}
Complex& Complex::abs(){
Complex& reference = *this;
+reference;
return reference;
}
ostream& operator<<(ostream& out, Complex& target){
out << "Real : ";
out << " " << target.getRealPart();
out << " imaginary :";
out <<target.getImaginaryPart();
return out;
}
istream& operator>>(const istream& input, Complex& target) {
string use;
input>>use;
stringstream convert(use);
int x = 0;
convert>>x;
target.set_R(x);
return input;
}
when doing calls such as
cout << "(" << number1 << ")" << " + " << "(" << number2 << ") = " << (number1 + number2) << endl;
it throws the following exception:
main.cpp:19:69: error: no match for ‘operator<<’ (operand types are ‘std::basic_ostream’ and ‘Complex’)
cout << "(" << number1 << ")" << " + " << "(" << number2 << ") = " << (number1 + number2) << endl;
In file included from main.cpp:1:0:
Complex.h:276:10: note: candidate: std::ostream& operator<<(std::ostream&, Complex&)
ostream& operator<<(ostream& out, Complex& target){
You have to overload the following function too!.
ostream& operator<<(ostream& out, Complex&& target){
out << "Real : ";
out << " " << target.getRealPart();
out << " imaginary :";
out <<target.getImaginaryPart();
return out;
}
Non-const references don't bind to temporaries.
So ostream& operator<<(ostream& out, Complex& target) can't be used in code that looks like cout << Complex{1.0} or cout << (complex1 + complex2), because in both cases the second argument is a temporary Complex instance.
A possible fix is to use const references when you don't plan to modify the argument:
ostream& operator<<(ostream& out, Complex const& target)
Another solution (for small objects) is to accept it by-value:
ostream& operator<<(ostream& out, Complex target)

C++ - Overloaded += Operators

I'm attempting to overload a += operator with the following line:
a = b += c += 100.01;
but my second += in that code shows an error as it matches no implementation i guess?
Heres my full relevant code:
main.cpp:
#include <iostream>
#include "Account.h"
using namespace sict;
void displayABC(const Account& a, const Account& b, const Account& c)
{
std::cout << "A: " << a << std::endl << "B: " << b << std::endl
<< "C: " << c << std::endl << "--------" << std::endl;
}
int main()
{
Account a("No Name");
Account b("Saving", 10000.99);
Account c("Checking", 100.99);
displayABC(a, b, c);
a = b + c;
displayABC(a, b, c);
a = "Joint";
displayABC(a, b, c);
a = b += c;
displayABC(a, b, c);
a = b += c += 100.01;
displayABC(a, b, c);
return 0;
}
Account.h (Relevant definitions)
class Account{
public:
friend Account operator+(const Account &p1, const Account &p2);
Account& operator+=(Account& s1);
Account & operator=(const char name[]);
friend double & operator+=(double & Q, Account & A);
Account & operator=(Account D);
};
Account operator+(const Account &p1, const Account &p2);
double operator+=(double& d, const Account& a);
};
Account.cpp (relevant implementations)
Account& Account::operator+=(Account &s1) {
double b = this->balance_ + s1.balance_;
this->balance_ = b;
return *this;
}
Account & Account::operator=(Account D) {
strcpy(name_, D.name_ );
this->balance_ = D.balance_;
return *this;
}
Account & Account::operator=(const char name[])
{
strcpy_s(name_, name);
return *this;
}
double & operator+=(double & Q, Account & A)
{
Q = Q + A.balance_;
return Q;
}
So my question is, how do i change my implementations correctly to run this function: a = b += c += 100.01;
Thank you.
In this statement
a = b += c += 100.01;
at first expression
c += 100.01
is evaluated. However the class does not have a corresponding overloaded operator.
On the other hand if the class has a conversion constructor that converts an object of type double to type Account nevertheless the corresponding operatpr += should be declared like
Account& operator+=(const Account& s1);
^^^^^
Also take into account that these declarations
friend double & operator+=(double & Q, Account & A);
and
double operator+=(double& d, const Account& a);
differ.

c++ generic operator overload

How could I use operator overloading to add two objects without making it a member of of any object? Is this something to do with insertion operator overloading?
so instead of this, to use something more generic i.e. to be used with any objects?:
sameObjectType operator + ( const sameObjectType &x, const sameObjectType &y ) {
sameObjectType z;
z = x+y;
return z;
}
// I want to do the same for subtraction operatoR
sameObjectType operator - ( const sameObjectType &x, const sameObjectType &y ) {
sameObjectType z;
z = x-y;
return z;
}
You can get the idea from this sample code.
#include <iostream>
class One {
private:
int num1, num2;
public:
One(int num1, int num2) : num1(num1), num2(num2) {}
One& operator += (const One&);
friend bool operator==(const One&, const One&);
friend std::ostream& operator<<(std::ostream&, const One&);
};
std::ostream&
operator<<(std::ostream& os, const One& rhs) {
return os << "(" << rhs.num1 << "#" << rhs.num2 << ")";
}
One& One::operator+=(const One& rhs) {
num1 += rhs.num1;
num2 += rhs.num2;
return *this;
}
One operator+(One lhs, const One &rhs)
{
return lhs+=rhs;
}
int main () {
One x(1,2), z(3,4);
std::cout << x << " + " << z << " => " << (x+z) << "\n";
}