通过const中间访问非const的设计模式

时间:2016-01-07 16:45:44

标签: c++ design-patterns const const-cast

对于我们希望两个对象通过const中间体相互“交谈”的情况,有人可以建议更好的设计。

这是一个人为的例子,两个玩家交易柠檬。 玩家在“世界”中找到另一个玩家,但“世界”应该是const,因为玩家不应该修改它(假设删除墙壁)。

void Player::give_lemon()
{
    const World& world = this->get_world();

    const Player& other = world.get_nearest_player(*this);

    this->lemons--;
    other.lemons++; // error
}

人们使用什么样的设计,简单const_cast容易但很脏。 或者我们可以提供一些“查找”非常量播放器引用的方法,让我们说可以访问非常量player_list()但是在这里我们将复制World中已有的功能,可能效率较低,所有这些都是针对特定const_cast的循环方式。

2 个答案:

答案 0 :(得分:1)

最直接的解决方案是让world.get_nearest_player()返回Player&,而不是const Player&

答案 1 :(得分:1)

似乎PlayerWorld都可以被视为演员

World恰好是const

引入一个处理两者的Manager类:

Manager会在其构造函数中使用const World,然后可以添加或删除Player

void Player::give_lemon()
{
    Manager& mgr = this->get_manager();

    Player& other = mgr.get_nearest_player(*this);

    this->lemons--;
    other.lemons++; // error
}

然后,经理会跟踪球员在其世界中的位置。 Worldconst,并且不能拥有可变的玩家列表,经理可以。