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

Boost C++ Discussion :

Boost, serialisation et classe virtuelle pure.


Sujet :

Boost C++

  1. #1
    Membre averti
    Homme Profil pro
    Analyse système
    Inscrit en
    Novembre 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 227
    Points : 311
    Points
    311
    Par défaut Boost, serialisation et classe virtuelle pure.
    Bonjour,

    Voici mon problème :
    J'ai une classe Mere qui sert d'interface et qui contient une fonction virtuelle pure. La classe définit donc des méthodes, mais possède également des attributs. J'ai implémenté la sérialisation avec Boost dans la classe Mere.
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    #ifndef _MERE_H_
    #define _MERE_H_
     
    // Librairies Boost pour la serialisation
    #include <boost/archive/xml_oarchive.hpp>     // Archive pour l'écriture XML
    #include <boost/archive/xml_iarchive.hpp>     // Archive pour la lecture des fichiers XML
    #include <boost/serialization/nvp.hpp>        // "Pair nom-valeur"
     
    #include <string>
    #include <fstream>
     
    class Mere
    {
      public :
        Mere(int a = 0);
     
        virtual void abstrait() {};
     
      protected:
        int m_a;
     
      protected :
        friend class boost::serialization::access;
        template<class Archive> void save( Archive &ar, const unsigned int version ) const;
        {
          using boost::serialization::make_nvp;
          ar & make_nvp("a",m_a);
        }
        template<class Archive> void load( Archive &ar, const unsigned int version );
        {
          using boost::serialization::make_nvp;
          ar & make_nvp("a",m_a);
        }
     
        BOOST_SERIALIZATION_SPLIT_MEMBER()
    };
     
    #endif
    J'ai une classe Fille qui hérite de mère et qui redéfinit toutes les fonctions virtuelles pures et qui implémente également la sérialisation.

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    #ifndef _FILLE_H_
    #define _FILLE_H_
     
    #include "mere.h"
     
    class Fille : public Mere
    {
      public :
        Fille();
        Fille(int a , double b);
        void abstrait();
      protected:
        int m_b;
     
      private:
        friend class boost::serialization::access;
        template<class Archive> void save( Archive &ar, const unsigned int version ) const;
        {
          using boost::serialization::make_nvp;
          ar & make_nvp("Mere",boost::serialization::base_object<Mere>(*this));
          ar & make_nvp("b",m_b);
        }
        template<class Archive> void load( Archive &ar, const unsigned int version );
        {
          using boost::serialization::make_nvp;
          ar & make_nvp("Mere",boost::serialization::base_object<Mere>(*this));
          ar & make_nvp("b",m_b);
        }
     
        BOOST_SERIALIZATION_SPLIT_MEMBER()
    };
     
    #endif
    Dans le main, j'implémente un pointeur sur la classe Fille
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include "fille.h"
     
    int main(int argc, char* argv[])
    {
      Fille *ptrFille = new Fille(1, 2.0);
     
    }
    A la compilation, j'ai le problème suivant :
    g++ -g -o zone51 main.o -L. -lstdc++ -lboost_serialization -lmere -lfille
    ./libfille.so: undefined reference to `void Mere::save<boost::archive : : xml_oarchive>(boost::archive : : xml_oarchive&, unsigned int) const'
    ./libfille.so: undefined reference to `void Mere::load<boost::archive : : xml_iarchive>(boost::archive : : xml_iarchive&, unsigned int)'
    collect2: ld a retourné 1 code d'état d'exécution
    make: *** [zone51] Erreur 1
    Le problème semble provenir du fait que ma classe Mere est une classe abstraite.
    Ma question est donc comment faire pour sérialiser les classes qui héritent de Mere?

  2. #2
    Débutant
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Points : 176
    Points
    176
    Par défaut
    si tu changes dans ta classe mère
    virtual void abstrait() {};

    par
    void abstrait() {};


    ça marche ou pas ?



  3. #3
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 620
    Points
    15 620
    Par défaut
    Bonjour

    Tu as mis des ";" en fin de ligne en trop :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    template<class Archive> void save(...) const;
    {
    ...
    }
    sur les 4 lignes de définition des fonctions save et load (un EDI correct signale l'erreur)

  4. #4
    Membre averti
    Homme Profil pro
    Analyse système
    Inscrit en
    Novembre 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 227
    Points : 311
    Points
    311
    Par défaut
    si tu changes dans ta classe mère
    virtual void abstrait() {};

    par
    void abstrait() {};
    Non ca ne change rien.

    tu as mis des ";" en fin de ligne en trop :
    C'est exacte, c'est parce que en fait j'ai sépraré l'impélémentation de la définition, et pour
    faire simple dans le code mis en ligen j'ai tout remis ensemble.
    Et c'est d'ailleurs de là que vient mon problème, je ne peux pas mettre la déclaration d'une fonction template ailleurs que dans le fichier d'inclusion. Sinon le compilateur ne peut pas trouver la fonction nécessaire.

    Merci d'avoir pris le temps de me lire.

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

Discussions similaires

  1. Classe virtuelle pure
    Par deubelte dans le forum C++
    Réponses: 31
    Dernier message: 24/10/2011, 10h42
  2. question sur les classes virtuelles pures
    Par deubelte dans le forum C++
    Réponses: 5
    Dernier message: 26/07/2010, 16h45
  3. aide classe virtuel pure
    Par wasdaka dans le forum C++
    Réponses: 2
    Dernier message: 20/04/2009, 22h21
  4. Réponses: 2
    Dernier message: 18/02/2009, 08h29
  5. Réponses: 8
    Dernier message: 16/10/2006, 12h28

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