Assignment operator with reference class member

前端 未结 3 1614
一向
一向 2021-01-01 13:24

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

相关标签:
3条回答
  • 2021-01-01 14:09

    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.

    0 讨论(0)
  • 2021-01-01 14:23

    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.

    0 讨论(0)
  • 2021-01-01 14:27

    It is really a hack over c++ design, but you can use placement new on 'this' to do that. I.e.

    MyClass::MyClass(ReferenceType& referenceTarget):
        myReference(referenceTarget)
    {}
    
    MyClass& MyClass::operator=(const MyClass& other)
    {
        new (this) MyClass(other.myReference);
        return *this;
    }
    
    0 讨论(0)
提交回复
热议问题