C ++尝试引用已删除的函数

时间:2019-04-07 14:26:38

标签: c++

我正在尝试临时存储唯一指针的向量,并在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的向量的所有权,反之亦然。但是,我得到:尝试引用已删除的函数错误。我该如何实现?

2 个答案:

答案 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>> && ,以表明您将离开该参数。)