我正在尝试编写以下复合类的有效实现:
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嵌入到复合材料中吗?提前谢谢!
答案 0 :(得分:3)
首先,使用适当的智能指针代替原始指针。
下一步 - 在您使用的方法中,reserve()
调用完全没必要 - swap()
只是交换内部指针。
最后 - 自从我们在2013年,C ++ 11已经被使用,所以构造函数应该是这样的:
composite::composite(std::vector<std::unique_ptr<base_class>> v)
: vec{ std::move(v) }
{
}
为什么这样?按值获取参数已将其复制,并且由于您不再使用该副本,因此可以安全地将其移出,从而实现初始化成员所需的最少量副本。
答案 1 :(得分:1)
如果您真的关心是否会创建任何向量的副本,则应首先通过引用传递构造函数参数。所以“通常”的实现看起来像这样:
composite::composite( const vector<base_class*>& Vec1 )
: Vec( Vec1 )
{
}
这将省略一份副本。在你有迹象表明这会导致任何问题之前,我不会为此烦恼。您之前已经进行了三次动态内存分配,为什么还要关注第四种?