C ++ - 表达式必须是可修改的左值

计算科学 C++
2021-12-28 06:20:21

我是 C++ 新手。我正在尝试设置一个非常基本的 TCG 游戏(只有奴才没有文字)。

我认为我的问题可能与指针有关。

下面是函数和属性:

Player *Game::Turn
Board Player::getBoard()
Card Card_collection::get(int i)
int Card::m_has_been_played_this_turn

板子继承自 Card_collection

我有:

(*Turn).getBoard().get(i).m_has_been_played_this_turn = 0;

我有一个编译器错误:

Expression must be modifiable lvalue '=' : left operand must be l-value

请问,您认为错误在哪里?

1个回答

这不是问这个问题的正确地方,所以为了将来参考,请在 Stack Overflow 上问这些类型的问题。

您并没有真正提供足够的代码来完全确定出了什么问题,但是考虑到错误,我想到的一件事如下。首先,请注意,您的get(int i)方法返回的是 a 的副本Card,而不是 Card Collection 中的实际 ith Card这意味着当你这样做时:

(*Turn).getBoard().get(i).m_has_been_played_this_turn = 0;

您实际上是在m_has_been_played_this_turn为临时Card实例设置变量,这可能是错误的来源,因为这个临时Card实例应该是 a rvalue,而不是 a lvalue

改变这种情况的一种方法可能是将您的代码更改为以下内容:

Card card_ = (*Turn).getBoard().get(i);
card_.m_has_been_played_this_turn = 0;

但这仍然无法实现我认为您想要的,因为card_它只是Card您卡片收藏中的 i 的副本。如果您真的想修改CardCard Collection 中的第 i 个,请将get(int i)定义更改为以下内容:

Card &  Card_collection::get(int i)

&意味着您将通过引用传递一个Cardout get(int i),允许您Card直接在 Card Collection 中修改。那么您编写的原始代码设置m_has_been_played_this_turn应该没问题。