J'ai une liste centrale d'implémentations d'une interface et souhaite que les classes dérivées puissent s'enregistrer elles-mêmes dans cette liste sans avoir à les ajouter dans une place centrale. Par exemple:Enregistrement de classes dérivées dans la liste centrale
// interface.h
struct MyInterface;
std::vector<MyInterface*>& InterfaceList();
struct MyInterface {
MyInterface() {
InterfaceList().push_back(this);
}
virtual ~MyInterface() {}
// ...
};
// derived.cpp
#include "interface.h"
class MyImplementation: public MyInterface {
public:
MyImplementation() {
}
// ...
};
MyImplementation impl;
Cela ne semble pas fonctionner. Pour des raisons que je ne comprends pas, le constructeur de MyInterface n'est jamais appelé - j'aurais pensé que l'instance de la classe dérivée l'appelle au démarrage. Je sais qu'il est possible de faire quelque chose dans ce sens puisque j'ai vu d'autres bibliothèques le faire - mais je n'ai pas réussi à comprendre ce que je fais de mal.
Merci :)
Modifier: Désolé, raté une paire de bretelles et une référence. InterfaceList() est une fonction qui renvoie une référence à un vecteur.
Éditer la partie 2: Nous l'avons maintenant fonctionné dans un exemple réduit, mais nous ne pouvons pas le faire fonctionner dans les fichiers pour les implémentations dérivées - mais cette technique fonctionne dans un autre projet. Il doit y avoir quelque chose de légèrement différent dans ces fichiers qui provoque l'échec - mais il semble que le problème ne soit pas dans le code que j'ai posté. Je ne veux pas vraiment afficher de gros morceaux de projets de mon employeur, donc je suppose que je vais devoir continuer à me tripoter. Merci pour les suggestions jusqu'à présent que :)
Où est votre dtor virtuel? vous en avez besoin dans votre classe de base. –
Anders: J'essaie d'afficher une version simplifiée du code, alors j'ai laissé de côté quelques morceaux. Pour les besoins de cette discussion, je m'en fous si ça fuit la mémoire :) – Peter