On Feb 19, 4:42 pm, Ian Collins<ian-n...@hotmail.com> wrote:
On 02/20/11 09:04 AM, Nephi Immortal wrote:
class A {
public:
explicit A( unsigned int data );
~A();
A( const A&right );
A&operator=( const A&right );
A&operator=( unsigned int data );
operator unsigned int();
friend A operator+( const A&left, const A&right );
friend A operator+( const A&left, unsigned int right );
friend A operator+( unsigned int left, const A&right );
friend A operator+=( const A&left, const A&right );
friend A operator+=( const A&left, unsigned int right );
friend A operator+=( unsigned int left, const A&right );
These should be members, returning A&. += updates the current instance,
it doesn't create a new one.
private:
unsigned int m_data;
};
<snip>
class B {
public:
explicit B( unsigned int&data );
Why do you use an int& here?
I won't comment further, I'm not sure what B is doing.
I tried to explain above. Class B needs to use reference on
constructor and data member. I did not post two functions. It should
clarify clearly.
Class A {
....
B Low_Byte();
B High_Byte();
....
};
B Low_Byte() {
Return B( this->m_data );
}
B High_Byte() {
Return B( this->m_data );
}
Now, you see class B modifies class A?s data member through reference
when Low_Byte() function is called. It looks like this.
A a( 2 ), b( 4 ), c( 0 );
c.Low_Byte() = a.Low_Byte() + b.Low_Byte();
You notice that class B?s operator+ only returns unsigned int instead
of returning class B reference. Returning class B reference can cause
to modify class A?s data member incorrectly through class B?s copy
constructor since returning class B should be local and not
reference. Returning unsigned int is the answer and class B?s
operator=( unsigned int ) is called before reference can modify class
A?s data member correctly.
Am I saying clearly?
Please explain why you think operator+ should be member function. It
needs to be global function because it has three possible operator+.
Other folks explained this earlier.
I didn't say that, I said operator += should be a member. Please
comment in-line, it makes replying with relevant context easier.