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

时间:2011-01-23 15:10:25

标签: 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;
};

这给了我一个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;
};

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

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

我对这个问题的看法太多了。我希望你们能告诉我我错过了什么:) 提前谢谢!

3 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:1)

问题很简单。您有作为班级成员的参考文献:

  

Layer& current_layer;

  

Cell& current_cell;

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

答案 2 :(得分:0)

Player不能有编译器生成的默认ctor,因为它有引用成员。什么是编译器应该将这些引用绑定到?