vector<Class>
而不是vector<Class*>
)。通常,轻微的性能损失可以通过不必记住删除动态分配对象来弥补。
不幸的是,当您想要存储从共同基类派生的各种对象类型时,值集合将无法正常工作。请参见下面的示例。
#include <iostream>
using namespace std;
class Parent
{
public:
Parent() : parent_mem(1) {}
virtual void write() { cout << "Parent: " << parent_mem << endl; }
int parent_mem;
};
class Child : public Parent
{
public:
Child() : child_mem(2) { parent_mem = 2; }
void write() { cout << "Child: " << parent_mem << ", " << child_mem << endl; }
int child_mem;
};
int main(int, char**)
{
// I can have a polymorphic container with pointer semantics
vector<Parent*> pointerVec;
pointerVec.push_back(new Parent());
pointerVec.push_back(new Child());
pointerVec[0]->write();
pointerVec[1]->write();
// Output:
//
// Parent: 1
// Child: 2, 2
// But I can't do it with value semantics
vector<Parent> valueVec;
valueVec.push_back(Parent());
valueVec.push_back(Child()); // gets turned into a Parent object :(
valueVec[0].write();
valueVec[1].write();
// Output:
//
// Parent: 1
// Parent: 2
}
我的问题是:我是否可以既使用值语义(value semantics)又使用多态容器(polymorphic containers)?还是必须使用指针?
boost::ptr_vector
通常是std::vector<boost::shared_ptr<T>>
更便宜、更简单的替代品。 - benclone_ptr
或value_ptr
类型可以实现这一点。 - Puppyshared_ptr
现在位于std
命名空间中。您应该使用这个而不是Boost的。 - Lynn