En règle générale, je préfère utiliser de la valeur plutôt que le pointeur de la sémantique dans le C++ (c'est à dire à l'aide de vector<Classe> au lieu de vector<Classe*>). Habituellement, la légère perte de performance est plus que de ne pas avoir à penser à supprimer les objets alloués dynamiquement.
Malheureusement, la valeur des collections ne fonctionne pas lorsque vous souhaitez stocker une variété de types d'objets qui dérivent toutes d'une base commune. Voir l'exemple ci-dessous.
#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
}
Ma question est: puis-je avoir mon gâteau (valeur sémantique) et le manger aussi (polymorphes conteneurs)? Ou dois-je utiliser des pointeurs?