En règle générale, je préfère utiliser une sémantique de valeur plutôt que de pointeur en C++ (c'est-à-dire utiliser vector<Class>
au lieu de vector<Class*>
). En général, la légère perte de performance est plus que compensée par le fait de ne pas avoir à se rappeler de supprimer les objets alloués dynamiquement.
Malheureusement, les collections de valeurs ne fonctionnent pas lorsque vous voulez stocker une variété de types d'objets qui dérivent tous 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 la suivante : puis-je avoir mon gâteau (sémantique des valeurs) et le manger aussi (conteneurs polymorphes) ? Ou dois-je utiliser des pointeurs ?