C++ C2582编译器不会自动生成默认的c'tor或=运算符

pdr*_*aus 1 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(Player &_owner) { this->owner = _owner; }

private:
    Player &owner;
};
Run Code Online (Sandbox Code Playgroud)

这给了我一个C2582,说set_owner函数中的'operator ='不适用于Player.我的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;
};
Run Code Online (Sandbox Code Playgroud)

到现在为止我认为我的默认构造函数/析构函数和=运算符会!如果我自己没有完成它(并且它们在整个程序中使用),则由编译器构造.显然这次不是这种情况,因为其他类也会抱怨从Player中删除手动插入的默认c'tor.我甚至尝试编写一个完全相同的小示例程序(即使使用前向声明和成员也是引用)并且它有效.

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

我对这个问题的想法非常多.我希望你们能告诉我我缺少的东西:)提前谢谢!

asc*_*ler 8

你不能"重新安置"引用,甚至不能作为引用的类成员. this->owner = _owner;不会改变成员引用的对象,它试图修改this->owner始终引用的对象并始终如此.

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