对于我们希望两个对象通过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
的循环方式。
答案 0 :(得分:1)
最直接的解决方案是让world.get_nearest_player()
返回Player&
,而不是const Player&
。
答案 1 :(得分:1)
似乎Player
和World
都可以被视为演员
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
}
然后,经理会跟踪球员在其世界中的位置。 World
是const
,并且不能拥有可变的玩家列表,经理可以。