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 标记的通过引用传递的类,这些类不是直接更改而是从另一端更改的? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

ThreadPool 如何处理传递的变量

Spring如何处理循环引用

Thrift 如何处理被拆分为多个消息的 Zlib 刷新标记?

通过引用传递使用 const 有啥意义? C++ [重复]

C++ 到 C# 移植问题:我将如何处理具有 double* 作为参数的方法?

当 RabbitMQ 交换不存在时如何处理错误(并且消息通过消息传递网关接口发送)