Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Crossing assignment operators?

Tags:

c++

It's time for my first question now. How do you cross assignments operators between two classes?

class B;

class A {
public:
A &operator = ( const B &b );
friend B &B::operator = ( const A &a ); //compiler error
};

class B {
public:
B &operator = ( const A &a );
friend A &A::operator = ( const B &b );
};

I searched for how to forward declare a member function like:

class B;
B &B::operator = ( const A &a ); //error

But I didn't find anything. And I don't want to make the classes all-out friends with each other. How do I do this?

like image 976
Jonas Avatar asked Aug 09 '26 23:08

Jonas


1 Answers

There is no way to forward-declare member functions. I'm not sure if there is a more elegant way than this to get what you want (I've never had reason to do something like this), but what would work would be to make for the second class a non-member function that is a friend to both classes, and delegate copying to it. Note that operator= cannot be itself a non-member, but something like this should work:

class B;

class A {
public:
  A& operator = ( const B &b );
  friend B& do_operator_equals ( B& b, const A& b);
};

class B {
public:
  B &operator = ( const A &a );
  friend A& A::operator = ( const B &b );
  friend B& do_operator_equals ( B& b, const A& a);
};

And then in your implementation file

A& A::operator= (const B& b) {
   // the actual code to copy a B into an A
   return *this;
}

B& B::operator= (const A& a) {
   return do_operator_equals(*this, a);
}

B& do_operator_equals(B& b, const A& a) {
  // the actual code to copy an A into a B
  return b;
}

Edit: Got the A's and B's backwards, oops. Fixed.

like image 141
Tyler McHenry Avatar answered Aug 11 '26 13:08

Tyler McHenry