1

我正在尝试编写以下复合类的有效实现:

class composite{
  vector<base_class *> Vec;
  //Other useful constants
public:
  composite(vector<base_class*>);
  //Other useful operations...
};

我的问题是关于类的构造函数和实例化,特别是对象 Vec。目前,我使用下面概述的相当粗略的实现。我的实现是内存高效的。我几乎是 C++ 的新手,所以我不确定我在这里是否有最佳解决方案......

我使用多态性将不同的派生类存储在向量中,例如

vector<base_class *> Vec1;
Vec1.reserve(2);
class1 * C1 = new class1(....);
Vec1.push_back(C1);
class2 * C2 = new class(....);
Vec1.push_back(C2);

其中 class1 和 class2 是 base_class 的派生类。然后我将 Vec1 传递给复合的构造函数,如下所示:

composite::composite(vector<base_class*> Vec1){
   Vec.reserve(Vec1.size());
   Vec.swap(Vec1);
   //etc...
}

我的感觉是这在内存上非常有效,因为 Vec1 在构造后将是空的(它的元素已被交换到 Vec)。另一方面,这似乎很浪费,因为我实际上是将 Vec1 复制到 Vec 中。我有更好的方法吗?我可以以某种方式将向量 Vec1 嵌入到复合中吗?提前致谢!

4

2 回答 2

3

首先,使用正确的智能指针而不是原始指针。

接下来 - 在您使用的方法中,reserve()调用是完全不必要的 -swap()只是交换内部指针。

最后 - 因为我们在 2013 年,C++11 已经被使用,所以构造函数应该是这样的:

composite::composite(std::vector<std::unique_ptr<base_class>> v) 
    : vec{ std::move(v) }
{
}

为什么这样?通过值获取参数已经复制它,并且由于您不再使用该副本,因此可以安全地移出,从而实现最少的副本数量来初始化成员。

于 2013-06-20T10:10:47.053 回答
1

如果您真的关心是否会制作任何向量的副本,您应该首先通过引用传递构造函数参数。所以“通常”的实现看起来像这样:

composite::composite( const vector<base_class*>& Vec1 )
  : Vec( Vec1 )
{
}

这将省略一个副本。在你有一些迹象表明这会导致任何问题之前,我不会为此烦恼。你之前已经做了三个动态内存分配,为什么还要关心第四个呢?

于 2013-06-20T10:05:09.157 回答