【发布时间】:2012-08-31 10:15:32
【问题描述】:
我目前正在阅读《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;
}
}
我首先在 c++ 中使用 shared_ptr 做了同样的事情。与我使用原始指针的第二个版本相比,它工作但非常慢。然后我尝试了 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() -
返回一个 unique_ptrs 向量意味着放弃它们,因此 Tile 不再可以访问它们。这就是你想要的吗?
-
你真的需要返回向量吗?如果你的类包装了
std::vector,你应该提供比这个访问器更好的对其数据的访问。这个例子清楚地表明,从 Java 到 C++ 的不费吹灰之力的重写不是要走的路。尤其是因为您没有提供任何新功能。 -
别忘了,Java“对象”是指针;即使看起来像按值返回,结果也指向原始对象。 C++ 中的类比是返回一个指针或引用。
-
原来的类无论如何设计都很糟糕,希望那本书能提到这一点。为什么封装一个容器只是为了提供对它的完全访问权限?
标签: c++ vector c++11 unique-ptr