Enregistrement automatique d'instance de classe
Bonjour,
Dans mon projet j'ai la classe abstraite suivante :
Fichier.h:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
| class PluginSequenceExtractor : public QObject{
Q_OBJECT
public:
explicit PluginSequenceExtractor(
QObject *parent = 0);
static QMap<QString, PluginSequenceExtractor*>
getExtractors();
virtual QString getName() = 0;
virtual QString getDescription() = 0;
virtual void analyseBuffer(
QAudioBuffer audioBuffer) = 0;
}; |
Fichier.cpp:
Code:
1 2 3 4 5 6 7 8
|
QList<PluginSequenceExtractor*>
PluginSequenceExtractor::extractors;
PluginSequenceExtractor::PluginSequenceExtractor(
QObject *parent) :
QObject(parent){
PluginSequenceExtractor::extractors << this; //PB ici
} |
Ensuite je voudrai ajouter chaque classe fille dans PluginSequenceExtractor::extractors. Pour ça je déclarer les classes filles de la manière suivante:
Fichier.h
Code:
1 2 3 4 5 6 7 8 9 10 11 12
| class HighFrequencyExtractor
: public PluginSequenceExtractor{
Q_OBJECT
public:
static HighFrequencyExtractor instance;
HighFrequencyExtractor(
QObject *parent = 0);
virtual QString getName();
virtual QString getDescription();
virtual void analyseBuffer(
QAudioBuffer audioBuffer);
}; |
Fichier.cpp
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| HighFrequencyExtractor
HighFrequencyExtractor::instance;
//====================================
HighFrequencyExtractor::HighFrequencyExtractor(
QObject *parent) :
PluginSequenceExtractor(parent){
}
//====================================
QString HighFrequencyExtractor::getName(){
QString name = "High frequency";
return name;
}
//====================================
QString HighFrequencyExtractor::getDescription(){
QString description = tr("Extractor that assumes the higher frequency as speech");
return description;
}
//====================================
void HighFrequencyExtractor::analyseBuffer(
QAudioBuffer audioBuffer){
} |
En créant la variable static HighFrequencyExtractor::instance, le constructeur PluginSequenceExtractor::PluginSequenceExtractor est appelé et l'instance de HighFrequencyExtractor est enregistré dans ma liste PluginSequenceExtractor::extractors. Avec ce mécanisme, l'utilisateur peut ajouter une nouvelle classe enregistrée automatiquement sans mettre à jour le code existant dans d'autres fichiers. Le problème est que cela marche seulement si PluginSequenceExtractor::extractors est la première des variables static initialisée. L'ordre dépend du compilateur. Avec an gcc récent sous linux ça marche, mais avec mingw32 c'est HighFrequencyExtractor::instance qui est initialisée en premier donc plantage lors de l'ajout dans PluginSequenceExtractor::extractors.
Quelqu'un sait comment je pourrai faire ça plus proprement? En gardant bien sûr pour objectif un système qui permet de créer une classe enregistrée automatiquement sans aucune mise à jour du code existant.
Merci d'avance,
Cédric