Re: Problems with + operator, trying to sum multiple objects
"david" <David.Abdurachmanov@gmail.com> wrote in message
news:11498be4-07b5-4aa7-a741-777b73cc0e84@j28g2000hsj.googlegroups.com...
Hi, first of all I am going to past a several parts of code.
That is my class for now:
class Aibe {
public:
Aibe(); // veikia
Aibe(int arr[], int length); // veikia
Aibe(int item, ...); // neveikia
~Aibe(); // veikia
bool issubset(Aibe &other);
void toArray(int **arr); // veikia
string toString(); // veikia
int length(); // veikia
ostream & operator << (Aibe &other); // veikia
Aibe & operator = (Aibe &two); // pending
Aibe operator + (Aibe &two); // veikia ?
Aibe operator - (Aibe &other); // pending
Aibe operator * (const Aibe &other); // pending
const Aibe & operator += (int value); // veikia
const Aibe & operator -= (int value); // veikia
private:
typedef struct child {
int value;
child *next;
} child;
child *root; // aibes pradzia
size_t size; // dydis
bool inset(int value); // veikia
};
<snip>
PROBLEM:
aaa = ddd works, so I can assume that it perfectly works with
assigment if there is only one object in the right side. But such this
as aaa = bbb + ccc + ... does not work, I get error:
Macintosh:pirma marius$ g++ -Wall -ansi -pedantic -o pirma pirma.cpp
pirma.cpp: In function 'int main(int, const char**)':
pirma.cpp:350: error: no match for 'operator=' in 'aaa = Aibe::operator
+(Aibe&)(((Aibe&)(& ddd)))'
pirma.cpp:245: note: candidates are: Aibe& Aibe::operator=(Aibe&)
The question is very easy, why it does not work, should I create some
special operator for multiple items?
P.S. aaa + bbb + ccc with no assignment works just fine, it returns
new instance of Aibe class. But I can not assign that to other
instance of Aibe, only if there is one item in the right.
Make the argument to operator= a const reference. The bbb + ccc + ...
creates a temporary and you can't bind a temporary to a non-const
reference.
In other words:
Aibe& operator=(const Aibe& two)
You seem to be misusing const elsewhere in the above as well, though I
haven't checked the code carefully (I just glanced over it). You probably
want the following:
Aibe operator+(const Aibe& two);
Aibe operator-(const Aibe& other);
Aibe operator*(const Aibe& other);
Aibe& operator+=(int value);
Aibe& operator-= (int value);
This one should be a global function:
ostream& operator<<(ostream& os, const Aibe& rhs);
Also, the Aibe argument should be a const reference unless you're actually
planning to change it during output (unusual and probably rather unwise).
One other thing to suggest is that you might want things like operator+,
operator- etc. to be non-member functions, i.e.
Aibe operator+(const Aibe& lhs, const Aibe& rhs);
etc.
This allows conversions on the left-hand argument as well as the right-hand
one (and why not? :-))
Hope this helps,
Stu
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]