C++ C++;C2582编译器赢得';t自动生成默认c';tor或=运算符

C++ C++;C2582编译器赢得';t自动生成默认c';tor或=运算符,c++,C++,撇开我使用getter/setter这一事实不谈,因为更有经验的C++程序员不会使用它们,我对以下代码有一个问题: #include "Player.h" class Entity { public: Entity::Entity(Player& _owner) : owner(_owner) { } Player &get_owner() { return this->owner; } void set_owner(Playe

撇开我使用getter/setter这一事实不谈,因为更有经验的C++程序员不会使用它们,我对以下代码有一个问题:

#include "Player.h"

class Entity 
{
public:
    Entity::Entity(Player& _owner) 
        : owner(_owner) { }
    Player &get_owner() { return this->owner; }
    void set_owner(Player &_owner) { this->owner = _owner; }

private:
    Player &owner;
};
这给了我一个C2582,表示“operator=”对于set_owner函数中的Player不可用。我的播放器类如下所示:

class Layer;
class Cell;

class Player
{
public:
    Player();
    void credit_to_balance(const long &_amount);
    ..more getter/setter..
private:
    long balance;
    Layer &current_layer;
    Cell &current_cell;
};
直到现在,我还以为我的默认构造函数/析构函数和=运算符会!总是如果我自己没有做过,则由编译器构造(并且它们在整个程序中都使用)。显然这次不是这样,因为其他类也会抱怨从播放器中删除手动插入的默认c'tor。我甚至试着编写一个小的示例程序,它的功能完全相同(即使有转发声明和作为引用的成员),它也能工作

在我看来,它肯定应该这样做,因为它只会复制一些引用和一个内在类型。这就是为什么我还没有尝试编写我自己的=运算符,因为我认为编译器为我这样做没有困难。对我来说,这将导致一个问题,即每次我向班级介绍新成员时,都要考虑更新它

关于这个问题,我的想法到此为止。我希望你们能告诉我我错过了什么:)
提前谢谢

问题很简单。您拥有作为类成员的引用:

层&当前_层

单元&当前单元


编译器无法生成构造函数,因为它不知道如何初始化这些引用,所以您需要定义自己的构造函数。

问题很简单。您拥有作为类成员的引用:

层&当前_层

单元&当前单元


编译器无法生成构造函数,因为它不知道如何初始化这些引用,所以您需要定义自己的构造函数。

播放器无法生成编译器生成的默认构造函数,因为它有引用成员。编译器应该将这些引用绑定到什么?

播放器不能有编译器生成的默认构造函数,因为它有引用成员。编译器应该将这些引用绑定到什么?

您不能“重置”引用,甚至不能“重置”作为引用的类成员<代码>此->所有者=\u所有者不会更改成员引用的对象,它正在尝试修改对象
this->owner
始终引用并将始终引用

如果需要类更改它引用的其他对象,请使用指针成员而不是引用成员。您可以保持相同的公共接口,只需使用
&
*
运算符来“转换”。

您不能“重置”引用,甚至不能“重置”作为引用的类成员<代码>此->所有者=\u所有者不会更改成员引用的对象,它正在尝试修改对象
this->owner
始终引用并将始终引用

如果需要类更改它引用的其他对象,请使用指针成员而不是引用成员。您可以保持相同的公共界面,只需使用
&
*
运算符进行“转换”