Как правило, я предпочитаю использовать значение, а не семантику указателя в C++ (то есть используя vector<Class>
вместо vector<Class*>
). Обычно небольшая потеря производительности более чем компенсируется тем, что не нужно запоминать удаленные динамически распределенные объекты.Могу ли я иметь полиморфные контейнеры со значениями семантики в C++?
К сожалению, коллекции значений не работают, если вы хотите хранить различные типы объектов, все из которых выведены из общей базы. См. Пример ниже.
#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
}
Мой вопрос: Могу ли я иметь мой торт (значение семантики) и съесть его (полиморфные контейнеры)? Или мне нужно использовать указатели?
`boost :: ptr_vector` часто является более дешевой и простой альтернативой` std :: vector> ` –
ben
2008-09-16 16:34:41
Этот ответ не рассматривает семантику значений. shared_ptr предоставляет ссылочную семантику над классами, полученными из T, для instace, shared_ptr a, b; b.reset (новый Derived1); a = b; не делает копию объекта Derived1. –
Aaron
2008-09-17 05:28:25