撇开我使用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 ¤t_layer;
Cell ¤t_cell;
};
到现在为止,我认为我的默认构造函数/析构函数和=运算符会永远!如果我自己没有完成它(并且它们在整个程序中使用),则由编译器构造。显然这次不是这种情况,因为其他类也会抱怨从Player中删除手动插入的默认c'tor。我甚至尝试编写一个完全相同的小示例程序(即使使用前向声明和成员也是引用)并且它有效。
在我看来它肯定应该,因为它只会复制一些引用和内在类型。这就是为什么我还没有尝试编写自己的=运算符,因为我认为编译器没有困难为我做这个。对我而言,每次我向班级介绍新成员时都会考虑更新它。
我对这个问题的看法太多了。我希望你们能告诉我我错过了什么:) 提前谢谢!
答案 0 :(得分:8)
你不能“重新安置”引用,甚至不能作为引用的类成员。 this->owner = _owner;
不会改变成员引用的对象,它试图修改始终引用的对象this->owner
并始终如此。
如果您需要更改其引用的其他对象的类,请使用指针成员而不是引用成员。您可以保留相同的公共界面,只需使用&
和*
运算符即可“转换”。
答案 1 :(得分:1)
问题很简单。您有作为班级成员的参考文献:
Layer& current_layer;
和
Cell& current_cell;
编译器无法生成构造函数,因为它不知道如何初始化这些引用,因此您需要定义自己的构造函数。
答案 2 :(得分:0)
Player不能有编译器生成的默认ctor,因为它有引用成员。什么是编译器应该将这些引用绑定到?