Como regla general, prefiero usar valor en lugar de semántica de puntero en C++ (es decir, usando vector<Class>
en lugar de vector<Class*>
). Por lo general, la ligera pérdida de rendimiento se compensa con la eliminación de objetos dinámicamente asignados.¿Puedo tener contenedores polimórficos con semántica de valores en C++?
Desafortunadamente, las colecciones de valores no funcionan cuando desea almacenar una variedad de tipos de objetos que todos derivan de una base común. Vea el ejemplo a continuación.
#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
}
Mi pregunta es: ¿Puedo tener tener mi torta (la semántica de valor) y comérselo también (contenedores polimórficos)? ¿O tengo que usar punteros?
'boost :: ptr_vector' es a menudo una alternativa más barata y sencilla a' std :: vector> ' –
ben
Esta respuesta no aborda la semántica del valor. shared_ptr proporciona semántica de referencia sobre las clases derivadas de T, para instace, shared_ptr a, b; b.reset (nuevo Derived1); a = b; no hace una copia del objeto Derived1. –
Aaron
Nunca dije que mi solución abordara la semántica de valores. Dije que era "una solución razonable". Si conoce una forma de tener una semántica de valores polimórficos, suba y obtenga su premio nobel. –