Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Assignment operator with reference class member

As long as new issues are growing out of my previous question Overloaded assignment operator causes warning about recursion, I was legitimately urged to post this as new one. I have a reference class member in my class Player and I want to implement the copy constructor and the assignment operator (=) of this class. I have to mention that the purpose is the fine working of the function vector.erase because without that it does not work properly as far as I am concerned. I use a vector: vector allPlayers; The members of the class Player are:

class Player
{

  private:
  int ID;
  int pMoney;
  int doubleIndicator;
  int squarePosition;
  Bank& bank;
  string pName;
  Square* capturedSquare;
  multimap<string, PropertySquare*> squaresColBought;
  multimap<string, House*> housesColBuilt;

}

Is it mandatory to avoid the use of reference as class member if I want to implement the assignment operator? What about the map members? How should I finally implement the assignment operator?

Another issue of utmost importance of which I am unaware is what happens to the objects pointed by pointers class members when I erase the iterator of the vector which hold the Player. Any help?

like image 441
arjacsoh Avatar asked Dec 26 '11 12:12

arjacsoh


People also ask

How do you reference class members from within a class?

The members of a class are referenced (accessed) by using the object of the class followed by the dot (membership) operator and the name of the member. The members of a class are referenced (accessed) by using the object of the class followed by the dot (membership) operator and the name of the member.

What is assignment operator function in C++?

Assignment operators are used to assigning value to a variable. The left side operand of the assignment operator is a variable and right side operand of the assignment operator is a value.

How do you write an assignment operator?

The assignment operator is used to assign the value, variable and function to another variable. Let's discuss the various types of the assignment operators such as =, +=, -=, /=, *= and %=. Example of the Assignment Operators: A = 5; // use Assignment symbol to assign 5 to the operand A.

Is assignment operator overloaded by default?

The assignment operator must be overloaded as a member function. This will call f1. operator=(f1), and under the simplistic implementation above, all of the members will be assigned to themselves.


2 Answers

A C++ 'reference' can only be initialized, not assigned:

int value1(1), value2(2);
int& ref1 = value1; // OK
int& ref2; // compile error: reference not initialized
int& ref3=ref1; // OK: ref3 refers to the same variable as ref1
ref1=value2; // equivalent to 'value1=value2'.

Therefor, an object containing a reference can only be initialized, too!

So indeed: if you need assignment on a class, that class cannot have reference member variables. (as a matter of fact, it could, but the assignment cannot make these members refer to another location)

When you think about this, it makes sense:

The reference concept defines 'an alias' for another variable. The aliasing implies that anything you do to your reference, you actually do to the referenced location. When you apply assignment to this alias, actually you assign to the referenced location. The purpose of the reference would be lost if you were able to make it point to a different location using assignment.

If the latter is what you need, you should use a pointer.

like image 74
xtofl Avatar answered Sep 24 '22 22:09

xtofl


I would refrain from using a reference member when you want an assignment operator. If you use a (smart) pointer instead, you can just do

Player &operator=(Player const &other)
{
    bankPtr = other.bankPtr;
    // copy other members
}

In the current situation, bank = other.bank will copy the contents of other.bank instead of pointing this->bank to the contents referenced by other.bank.

As for the multimap-typed members, they can be copied without problems, but do keep in mind that you'll get a "deep" copy of the keys (since they're of type string) but a "shallow" pointer copy of the values, so you end up with shared state. You might want to use shared_ptr for the values.

like image 37
Fred Foo Avatar answered Sep 22 '22 22:09

Fred Foo