我正在尝试临时存储唯一指针的向量,并在2个对象之间进行切换。在这里,我尝试将向量的所有权移至名为oldcards
的临时向量。
std::vector<std::unique_ptr<Building>> oldCards = std::move(player.getBuildingCards());
player.setBuildingCards(std::move(otherPlayer.getBuildingCards()));
otherPlayer.setBuildingCards(std::move(oldCards));
Player.cpp
std::vector<std::unique_ptr<Building>> const& Player::getBuildingCards() const
{
return this->buildingCards;
}
void Player::setBuildingCards(std::vector<std::unique_ptr<Building>> buildingCards)
{
this->buildingCards = std::move(buildingCards);
}
Player.h
std::vector<std::unique_ptr<Building>> buildingCards;
总结:我想交换2个向量,我希望player
拥有otherPlayer
的向量的所有权,反之亦然。但是,我得到:尝试引用已删除的函数错误。我该如何实现?
答案 0 :(得分:0)
您无法从// /---- the parameter "x"
// v vvvvvvvvvvv--- the parameter "f" with a default value
console.log(function(x, f = () => x) {
var x; // <=== the *variable* x, which gets its initial value from the
// parameter x
var y = x; // <=== sets y to 1 (x's current value)
x = 2; // <=== changes the *variable* x's value to 2
// +---------- 2, because this is the *variable* x
// | +------- 1, because this is the variable y
// | | +--- 1, because f is () => x, but that x is the *parameter* x,
// | | | whose value is still 1
// v v vvv
return [x, y, f()];
}(1));
移出,因此会调用cons T&
的副本构造函数,该副本构造函数当然已删除。 oldCards
无法更改player.getBuildingCards()
实例,因为您将其标记为const。
最干净的解决方案(至少根据我的说法)将实现player
朋友功能:
swapBuildingCards
答案 1 :(得分:0)
我试图临时存储唯一指针的向量,并在2个对象之间进行切换。
为什么?使用std::vector::swap
可以轻松完成相同的任务。 (请注意,这种交换很可能应该在成员函数内进行,因此不需要使用公共访问器函数。)
std::vector<std::unique_ptr<Building>>
const
& Player::getBuildingCards() const
这将返回一个const
引用。不允许您更改标记为const
的内容。将数据移出某物就等于更改了某物,因此不允许从getBuildingCards()
移出。
void Player::setBuildingCards(std::vector<std::unique_ptr<Building>> buildingCards)
此函数将向量的副本作为参数。由于unique_ptr
的向量无法复制,因此此函数签名为DOA。 (出于预期目的,您希望参数的类型为std::vector<std::unique_ptr<Building>>
&&
,以表明您将离开该参数。)