繁体   English   中英

具有引用类成员的赋值运算符

[英]Assignment operator with reference class member

只要我之前的问题出现了新问题Overloaded assignment operator 导致关于递归的警告,我就被合理地敦促将其作为新问题发布。 我的类 Player 中有一个引用类成员,我想实现这个类的复制构造函数和赋值运算符 (=)。 我不得不提到,目的是函数 vector.erase 的正常工作,因为没有它,就我而言它无法正常工作。 我使用一个向量:vector allPlayers; Player 类的成员是:

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;

}

如果我想实现赋值运算符,是否必须避免使用引用作为类成员? 地图成员呢? 我最终应该如何实现赋值运算符?

另一个我不知道的最重要的问题是,当我擦除持有 Player 的向量的迭代器时,指针类成员指向的对象会发生什么。 有什么帮助吗?

C++“引用”只能被初始化,不能被赋值:

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'.

因此,包含引用的对象也只能初始化!

确实如此:如果您需要对类进行赋值,则该类不能具有引用成员变量。 (事实上​​是可以的,但是赋值不能让这些成员指向另一个位置)

当你想到这一点时,它是有道理的:

引用概念为另一个变量定义了“别名”。 别名意味着您对引用所做的任何事情,实际上都是对引用的位置所做的。 当您对这个别名应用分配时,实际上您分配给了引用的位置。 如果您能够使用赋值将其指向不同的位置,则引用的目的将丢失。

如果后者是你所需要的,你应该使用指针。

当您需要赋值运算符时,我会避免使用引用成员。 如果您改用(智能)指针,则可以这样做

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

在当前形势下, bank = other.bank将复制的内容other.bank而不是指向this->bank被引用的内容other.bank

至于multimap类型的成员,可以毫无问题地复制它们,但请记住,您将获得键的“深”副本(因为它们是string类型),但是“浅”指针副本值,因此您最终会获得共享状态。 您可能希望对值使用shared_ptr

这确实是对 C++ 设计的一种黑客攻击,但您可以在“this”上使用placement new 来做到这一点。 IE

MyClass::MyClass(ReferenceType& referenceTarget):
    myReference(referenceTarget)
{}

MyClass& MyClass::operator=(const MyClass& other)
{
    new (this) MyClass(other.myReference);
    return *this;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM