Bonjour,
Dans mon projet j'ai la classe abstraite suivante :
Fichier.h:
Fichier.cpp:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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; };
Ensuite je voudrai ajouter chaque classe fille dans PluginSequenceExtractor::extractors. Pour ça je déclarer les classes filles de la manière suivante:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 QList<PluginSequenceExtractor*> PluginSequenceExtractor::extractors; PluginSequenceExtractor::PluginSequenceExtractor( QObject *parent) : QObject(parent){ PluginSequenceExtractor::extractors << this; //PB ici }
Fichier.h
Fichier.cpp
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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); };
En créant la variable static HighFrequencyExtractor::instance, le constructeur PluginSequenceExtractor:luginSequenceExtractor 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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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){ }
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
Partager