6
votes

Création d'une matrice pouvant contenir des objets de différentes classes en C ++

Comment créer une matrice pouvant contenir des objets de différentes classes en C ++?


0 commentaires

4 Réponses :


11
votes

Vous pouvez utiliser Boost :: Tout ou boost :: variante (comparer entre les deux: [1] ).

Alternativement, si les "objets de différentes classes" ont un ancêtres communs (disons, base ), vous pouvez utiliser un std :: vecteur ( ou std :: vecteur > ) et lancer le résultat à dérivé * lorsque vous en avez besoin.


2 commentaires

Il y a aussi Boost: Variante. Mais je ne recommanderais pas cette approche à moins que vous ne souhaitiez vraiment conserver des objets de classes non liées. Sinon, l'option 2 est probablement meilleure.


Je recommanderais variante sur tout si la collection est connue. Le chèque statique est un énorme attrait. C'est aussi plus rapide, ce qui est un bon bonus.



3
votes

Définissez une classe de base et dérivez toutes vos classes de ceci.

Ensuite, vous pouvez créer une liste de type (base *) et pourrait contenir n'importe quel objet de type de base ou de type dérivé


6 commentaires

Il doit être des pointeurs sur la classe de base (ou au moins une sorte de référence), sinon vous allez couper les objets à la base.


@Skurmedel - évidemment, il doit être un pointeur. qui penserait à la mettre comme des valeurs? ... de toute façon je vais éditer ma réponse


N'est-il pas possible que cette matrice soit de vide * Tapez et maintenez les objets, comme Void ObjectsListList [] = {Object1, Object2, Object3, Nil};


@Isight: C'est, mais alors comment supprimeriez-vous les objets ou même savoir ce qu'ils sont? Le point est que vous devez avoir une interface commune à tous les objets de la matrice ou des objets doivent avoir RTTI (normalement toute fonction virtuelle donnera cela) afin que vous puissiez dynamic_cast pointeurs.


@Doublep OK Merci pour cette suggestion, j'ai besoin d'hériter d'une classe commune qui a une fonction virtuelle qui renvoie le nom de classe où il sera mis en œuvre dans toutes les classes héritantes de la classe de base. Ensuite, après la mise en forme de type à la classe de base et appeler la fonction qui renvoie le nom des sous-classes respectives, je peux ensuite la convertir en type de sous-classe correspondant. Cela va-t-il travailler ....


@Isight - Vous n'avez pas besoin d'une fonction qui renvoie un identifiant ou un nom. En tant que doublep mentionné, utilisez RTTI. Il y a un opérateur Typeid pour obtenir le type d'objet. juste google it ..



2
votes

Regardez Boost :: Fusion qui est une réplique de stl, mais avec la possibilité de stocker différents types de données dans des conteneurs


0 commentaires

1
votes

Si vous souhaitez créer votre propre accès, enveloppez un accès à un pointeur / une matrice à l'aide de modèles et de surcharge de l'opérateur. Vous trouverez ci-dessous un petit exemple: xxx


1 commentaires

Cependant, cela ne tient qu'un type par exemple. Je ne sais pas comment implémenter un conteneur pouvant stocker différents types de données dans une instance. Peut-être en utilisant des modèles de fonction en quelque sorte?