gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 10:21:06 25 4
gpt4 key购买 nike

抛开我使用 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;
};

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

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

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

最佳答案

您不能“重新设置”一个引用,即使是引用的类成员也不能。 this->owner = _owner; 不会更改成员引用的对象,它会尝试修改 this->owner 一直引用的对象,并将永远引用.

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

关于C++ C2582 编译器不会自动生成默认的 c'tor 或 = 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4774508/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com