【发布时间】:2020-05-02 21:21:39
【问题描述】:
我正在尝试制作基于文本的大富翁游戏。对于板上的每个图块,我都有一个 Tile 或 PropertyTile 对象。 PropertyTile 是 Tile 类的子类,具有额外的属性。 最初我有一个向量来保存所有的瓦片,包括 Tile 和 PropertyTile,但后来发现由于 Object slicing,正确的方法是使用 unique_ptr。
当我切换到 unique_ptr 时,我得到了 2 个相同的错误:
Error C2280 'std::unique_ptr<Tile,std::default_delete<_Ty>> &std::unique_ptr<_Ty,std::default_delete<_Ty>>::operator =(const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)': attempting to reference a deleted function
with
[
_Ty=Tile
] MonopolyFinal C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.22.27905\include\xutility 1768
第一个是通过将move()放在Map::getAllTiles()中解决的,如下图。
第二个错误指向 Map.h 的第 30 行,即 (vector<unique_ptr<Tile>> tiles;)。
对于 Map.cpp Map::Map(),我尝试了 emplace_back 和 push_back,有和没有 move()。
我不确定我做错了什么。下面的所有相关代码。提前致谢。
地图.h:
class Map
{
public:
Map();
void display(Player, Player, Player, Player);
vector<unique_ptr<Tile>> getAllTiles();
vector<vector<bool>> getAllTileValidty();
private:
vector<unique_ptr<Tile>> tiles;
vector<vector<bool>> tileValidity;
};
Map.cpp 中填充瓦片向量的构造函数:
Map::tiles.push_back(move(unique_ptr<Tile>(new PropertyTile("Mediterranean Ave", 9, 10, "Brown", 60, 2, 50) )));
Map::tiles.push_back(move(unique_ptr<Tile>(new Tile("Community Chest", 8, 10)))); //Community Chest (usually gives you extra money)
瓷砖矢量的吸气剂:
vector<unique_ptr<Tile>> Map::getAllTiles()
{
return move(tiles);
}
【问题讨论】:
-
您发布的代码看起来不错(从结果来看)。问题可能出在其他地方。你能提供一个minimal reproducible example吗?
-
错误无法根据提供的代码重现。改进 Map::tiles.emplace_back(std::make_unique
(params...));
标签: c++ vector polymorphism unique-ptr