Je travaille en multi-plateforme C++, et ont des classes définies comme ceci: (très simplifié pour cet exemple)C++ Collection d'exemples de mise en œuvre d'une classe virtuelle pure
class ExampleBase
{
public:
ExampleBase(int blah) : blah_test(blah) { }
virtual void DoSomething() = 0;
private:
int blah_test;
};
class ExampleImplementer : public ExampleBase
{
public:
ExampleImplementer() : ExampleBase(5) { }
virtual void DoSomething() { /* unique implementation here */ }
};
Au départ, je n'avais qu'une seule classe, que j'ai stocké un tas d'instances de dans un std :: vector et passé par la référence const. Mais maintenant je dois avoir une classe de base (que je veux garder pure virtuelle) et un certain nombre de classes d'implémentation polymorphes. Quelle est la meilleure façon d'avoir une collection d'instances d'implémentation, et d'avoir toujours une gestion facile de la mémoire sans fuites comme si une pile était allouée à std :: vector?
Je ne peux évidemment pas un std :: vecteur < ExampleBase> maintenant, puisque std :: vecteur nécessite la classe d'être virtuelle non pur (car il fait l'allocation interne/copie, etc.). Je ne veux pas que les utilisateurs de mon code créent accidentellement des instances de ExampleBase parce que c'est faux. Je tiens également à éviter toute possibilité de tranchage d'objets ou de toute autre méchanceté. Un tableau de
std::auto_ptr
ferait l'affaire, mais alors je dois les initialiser tous, à la recherche d'un "slot libre", pas d'itérateurs, etc. Il semble un peu fou de faire toute cette roue. inventer.boost::ptr_vector
semblait prometteur, mais il se comporte un peu bizarrement en ce que lorsque la construction sur Linux dont il a besoin ExampleBase être virtuel non pur - et je ne comprends pas pourquoi ... Alorsboost::ptr_vector
est sorti.
Cela semble être une situation simple et probablement très courante. Alors, quelle est la meilleure façon de faire cela? Je suis ouvert à tout autre moyen de promotion ou de promotion: celui qui est le «meilleur».
Veuillez fournir le message d'erreur que vous obtenez pour 'ptr_vector'. Cela ne devrait certainement pas exiger que la classe de base soit non abstraite - quelque chose d'autre ne va pas. –
Merci, bonnes réponses! – maxpenguin
La suppression d'objets via un pointeur de type ABC * (classe de base abstraite) ne fonctionne tout simplement pas si ABC n'inclut pas de destructeur virtuel. L'erreur de compilation que vous obtenez vous protège réellement contre un comportement indéfini. – sellibitze