C++ 如何处理 const 标记的通过引用传递的类,这些类不是直接更改而是从另一端更改的? [复制]
Posted
技术标签:
【中文标题】C++ 如何处理 const 标记的通过引用传递的类,这些类不是直接更改而是从另一端更改的? [复制]【英文标题】:How does C++ handle const marked passed-by-reference classes, that aren't changed directly but from the other side? [duplicate] 【发布时间】:2021-11-16 05:59:23 【问题描述】:所以我现在正在制作一个国际象棋引擎,并且我有一个包含 Advantage 对象的 Game 类,我正在使用一种奇怪的方法来修改它们。它涉及 Game 类调用 Advantage 类的成员函数,它通过引用 Advantage 类来传递自身,并标记为 const。我现在遇到了一些我不习惯的错误,并决定我并不完全理解这是如何工作的。所以这里有一些伪代码,谁能给我解释一下?
class Game ;
class Advantage
private:
bool whiteWinning_ = true;
public:
void updateAdvantage(const Game& game);
class Game
private:
Advantage advantage_;
int pawnLocation_ = 1; //obviously, this isn't a real chess game, but still...
public:
void makeMove(int pawnSteps);
bool getWinning() const;
void Advantage::updateAdvantage(const Game& game)
//Game is marked const, but the same object is changed because advantage_ is being changed???
whiteWinning_ = game.getWinning();
void Game::makeMove(int pawnSteps)
pawnLocation_ += pawnsteps;
advantage_.updateAdvantage(*this);
bool Game::getWinning() const
return pawnLocation_ >= 8;
【问题讨论】:
有什么错误?我看不出上面的代码有什么问题。成员函数Advantage::updateAdvantage
未标记为 const,因此更新 whiteWinning_
没有问题。
与其追逐假设的错误,不如指出实际的错误……或尝试缩小范围。如果它们是运行时错误,则需要进行一些调试。
【参考方案1】:
传递给Advantage::updateAdvantage
的游戏对象正在将您的参数转换为const
。但是,Advantage::updateAdvantage
中的 Advantage
对象(表示为 this
)不是 const,因此允许您写入 whiteWinning_
。
【讨论】:
Re:“转换你的论点”——这段代码中没有转换。总之,对象的名称被转换为const
引用。强制转换是您在源代码中编写的内容,用于告诉编译器进行转换。 +1。
你绝对错了。在显式转换的情况下,转换可能是您在代码中看到的东西,但您可能有一个转换,机器人出现在称为隐式转换的代码中。
你说得对,初学者常用“隐式转换”来描述隐式转换。不过,演员表是您在源代码中编写的内容。不存在隐式强制转换。
感谢您的澄清。
const 占用game
对象。 whiteWinning_
是 Advantage
类成员,但在此上下文中 this
是非常量以上是关于C++ 如何处理 const 标记的通过引用传递的类,这些类不是直接更改而是从另一端更改的? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
Thrift 如何处理被拆分为多个消息的 Zlib 刷新标记?