我目前正在学习《Head First Object Oriented Analysis and Design》这本书,并同时熟悉C++11的一些特性(尤其是unique_ptr和move语义)。在书中,他们以一个策略棋盘游戏的设计作为示例。它有一个棋盘、方块和方块上的单位。代码是用Java编写的,我试图将其改写成C++。在Java中,tile类如下:
public class Tile
{
private List units;
public Tile()
{
units = new LinkedList();
}
protected void addUnit(Unit unit)
{
units.add(unit);
}
protected List getUnits()
{
return units;
}
}
我最初使用 shared_ptr 在 C++ 中完成了同样的事情。它确实可以工作,但与我使用原始指针的第二个版本相比非常慢。然后我尝试了 unique_ptr:
class Tile
{
public:
Tile();
virtual ~Tile();
void addUnit()
{
mUnits.push_back(std::unique_ptr<Unit>(new Unit());
}
std::vector<std::unique_ptr<Unit>> getUnits()
{
return mUnits;
}
private:
std::vector<std::unique_ptr<Unit>> mUnits;
};
编译器不喜欢getUnits函数。从我的理解来看,这是由于unique_ptr禁用了复制构造函数的原因。你如何返回向量列表?
std::vector<std::unique_ptr<Unit>>& getUnits()
- hmjdstd::vector
,那么你应该提供比这个访问器更好的对其数据的访问方式。这个例子清楚地说明了从Java到C++的机械性改写不是正确的方法,特别是因为你没有提供任何新功能。 - Bartek Banachewicz