IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Enregistrement automatique d'instance de classe


Sujet :

C++

  1. #1
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Mars 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 8
    Points : 10
    Points
    10
    Par défaut Enregistrement automatique d'instance de classe
    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

  2. #2
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 60
    Points : 71
    Points
    71
    Par défaut
    Bonjour,

    C'est un effet appelé 'fiasco des variables statiques'.
    Ton problème est résolu dans la FAQ : http://cpp.developpez.com/faq/cpp/?p...prevent_membre

    Bonne journée

  3. #3
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Mars 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 8
    Points : 10
    Points
    10
    Par défaut
    Génial merci beaucoup.
    Par rapport à mon problème j'ai remplacé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    QList<PluginSequenceExtractor*>
            PluginSequenceExtractor::extractors;
    par la méthode static suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    QList<PluginSequenceExtractor*>
            *PluginSequenceExtractor::getExtractors;(){
        static QList<PluginSequenceExtractor*> *list
            = new QList<PluginSequenceExtractor*>();
        return list;
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Exporter une instance de classe au format XML ou XMI
    Par Scorpion Rouge dans le forum Persistance des données
    Réponses: 2
    Dernier message: 22/12/2005, 12h19
  2. [RAVE] Enregistrer automatiquement un rapport
    Par Cryonie dans le forum Bases de données
    Réponses: 8
    Dernier message: 11/10/2005, 13h01
  3. Réponses: 2
    Dernier message: 09/10/2005, 16h35
  4. Instance de classes
    Par KymZen dans le forum Tkinter
    Réponses: 9
    Dernier message: 07/04/2005, 09h35
  5. Conditions de destruction des instances de classes
    Par elvivo dans le forum Général Python
    Réponses: 4
    Dernier message: 29/12/2004, 18h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo