Bonjour,

Dans mon projet j'ai la classe abstraite suivante :

Fichier.h:
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;
};
Fichier.cpp:
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
}
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 : 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);
};
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
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: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.

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