Re: operator+ in derived classes
Jim Langston wrote:
"Jim Langston" <tazmaster@rocketmail.com> wrote in message
news:If2Ph.5344$Ai4.4832@newsfe06.lga...
"Victor Bazarov" <v.Abazarov@comAcast.net> wrote in message
news:PfKdnSSPE-V-4pHbnZ2dnUVZ_v-tnZ2d@comcast.com...
Jim Langston wrote:
"Jim Langston" <tazmaster@rocketmail.com> wrote in message
news:7h_Oh.12407$1W5.11275@newsfe02.lga...
This is something someone was asking in irc. I really don't need
to do this right now, but may have to in the future. The
following code is in error (marked).
#include <iostream>
#include <string>
class Base
{
public:
Base( const int x = 0): x_( x ) {}
Base operator+( const Base b ) { Base Temp( x_ ); Temp.x_ +=
b.x_; return Temp; }
int X() { return x_; }
virtual ~Base() {}
private:
int x_;
};
class Derived: public Base
{
public:
Derived( const int x = 0, const int y = 0): Base( x ), y_( y )
{}
Add here
Derived(const Base& b) : Base(b), y_(0) {}
int Y() { return y_; }
private:
int y_;
};
int main()
{
Base MyBase(10);
std::cout << MyBase.X() << "\n";
Base MyBase2 = MyBase + Base(5);
std::cout << MyBase2.X() << "\n";
Derived MyDerived( 10, 20 );
std::cout << MyDerived.X() << " " << MyDerived.Y() << "\n";
My bad, the following line is the one in error, not the one below
it. It's the operator+ that's causing the problem, not the X() and
Y(); Derived MyDerived2 = MyDerived + Derived( 5, 10 );
// error C2440: 'initializing' : cannot convert from 'Base' to
'Derived' // No constructor could take the source type, or
constructor
std::cout << MyDerived.X() << " " << MyDerived.Y() << "\n";
overload resolution was ambiguous
std::string wait;
std::getline( std::cin, wait );
}
I understand the error. I am tryign to operator+ on derived, but
the only operator + is on base.
How do people handle this?
Add the constructor from Base.
That semi works. I.E. After fixing typos (actually displaying
MyDerived2 values) my output is:
10
15
10 20
15 0
When I would want output of:
10
15
10 20
15 30
<Snipped trial and error til I got it right>
This is what I wound up donig. Is this the way you would necessarily
do it?
#include <iostream>
#include <string>
class Base
{
public:
Base( const int x = 0): x_( x ) {}
Base operator+( const Base b ) const { Base Temp( x_ ); Temp.x_ +=
b.x_; return Temp; }
It should really be shorter:
Base operator+(const Base& b) const { return Base(b.x_ + x_); }
int X() const { return x_; }
virtual ~Base() {}
private:
int x_;
};
class Derived: public Base
{
public:
Derived( const int x = 0, const int y = 0): Base( x ), y_( y ) {}
Derived operator+( const Derived& d ) const
{
Base TempBase = Base( this->X() ) + Base( d.X() );
Derived Temp( TempBase.X(), y_ );
Temp.y_ += d.y_;
return Temp;
}
Yep, something like that. You don't really need to construct new Base
objects from X(). You could just cast '*this' and 'd' to Base&:
Derived operator+( const Derived& d ) const
{
Base TempBase(Base(*this) + Base(d)); // fall back on Base::op+
return Derived( TempBase.X(), y_ + d_.y );
}
int Y() const { return y_; }
private:
int y_;
};
int main()
{
Base MyBase(10);
std::cout << MyBase.X() << "\n";
Base MyBase2 = MyBase + Base(5);
std::cout << MyBase2.X() << "\n";
Derived MyDerived( 10, 20 );
std::cout << MyDerived.X() << " " << MyDerived.Y() << "\n";
Derived MyDerived2 = MyDerived + Derived( 5, 10 );
std::cout << MyDerived2.X() << " " << MyDerived2.Y() << "\n";
std::string wait;
std::getline( std::cin, wait );
}
Output is my wanted:
10
15
10 20
15 30
See above. I don't know the output -- no time to try, and too lazy
to just look and figure it out. However, it might not be what you
want. Generally, you do want to fall back on Base::operator+ as
much as possible instead of adding 'x_' values yourself. For that
you might want to make operator+ virtual...
V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask