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

Langage C++ Discussion :

Initialisation d'un objet contenu dans un autre.


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    37
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 37
    Par défaut Initialisation d'un objet contenu dans un autre.
    Bonjour !

    Je suis de nouveau confronté à un problème "basique" me sembe-t-il... Sans trouver d'indice dans la FAQ (probablement mal cherché)...

    J'ai un objet d'une classe "Contenant" qui a pour donnée membre un objet d'une classe "Contenu". "Contenu" a un constructeur sans paramètres et un constructeur prenant un string en argument.
    Je peux initialiser facilement Contenu par la liste d'initialisation du constructeur de contenant en lui passant un string.

    Mais un problème se pose lorsque je dois construire le string en plusieurs étapes avant de le passer au constructeur de Contenu. Ainsi, si je fais ce traitement dans le corps du constructeur, je ne sais pas si mon objet "Contenu" a deja été initialisé (Je suppose que oui avec le constructeur "par défaut") et/ou comment appeler son constructeur correctement une fois que j'ai réussi à construire mon string.

    En bref, la question basique c'est "Comment appeler correctement le constructeur de l'objet "Contenu", dans le corps du constructeur de "Contenant". Pour une fois je prefererais eviter d'utiliser un pointeur et de gerer l'objet en memoire dynamique.

    Un exemple ci-dessous ou l'on voudrait concatener le compteur d'instance à la chaine de "Contenant" avant de la passer au constructeur de "Contenu".

    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
    class CContenu
    {
    private:
     
        std::string m_message;
     
    public:
     
        CContenu()
        :m_message(std::string("Par defaut"))
        {}
     
        CContenu(std::string message)
        :m_message(message)
        {}
    }
     
    class CContenant
    {
    private:
     
        static int compteur_instance;
     
        CContenu m_contenu;
     
    public:
     
        // Premier exemple ou on ne fait que passer le message au contenu, pas de souci
        CContenant(std::string message)
        :m_contenu(message)
        {
            CContenant::compteur_instance++;
        }
    }
     
    // initialisation de la variable statique
    CContenant::compteur_instance=0;
    Or si je veux concatener à "message" la valeur de compteur_instance, je dois, je pense faire quelque chose du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ostringstream oss;
    oss << CContenant::compteur_instance;
    std::string messageFinal=message+oss.str();
    Or je ne pense pas pouvoir faire ca dans la liste d'initialisation.
    Donc, si je le met dans le corps du constructeur, comment faire pour initialiser m_contenu avec messageFinal ?

    Merci d'avance pour votre aide et désolé de poser une question si basique mais je crois que mes cours de C++ sont trop loins derrière moi...

    B.

  2. #2
    screetch
    Invité(e)
    Par défaut
    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
    39
    40
    41
    class CContenu
    {
    private:
     
        std::string m_message;
     
    public:
     
        CContenu()
        :m_message(std::string("Par defaut"))
        {}
     
        CContenu(std::string message)
        :m_message(message)
        {}
    }
     
    class CContenant
    {
    private:
     
        static int compteur_instance;
     
        CContenu m_contenu;
     
        static std::string buildMessage(const std::string& prefix)
        {
            ostringstream oss;
            oss << compteur_instance;
            return=message+oss.str();
        }
    public:
        CContenant(const std::string& message)
        :m_contenu(buildMessage(message))
        {
            CContenant::compteur_instance++;
        }
    }
     
    // initialisation de la variable statique
    CContenant::compteur_instance=0;

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    37
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 37
    Par défaut
    Ok je vois... Simple et efficace, je ne savais pas qu'on pouvait faire appel a une fonction statique dans la liste d'init.
    Dommage que cela alourdisse la definitin de la classe cela dit.

    Au passage je note la modif pour passer par adresse le message

    Merci pour ta réponse !

    C'est l'unique façon de faire ? Et surtout c'est une pratique courante ?

  4. #4
    screetch
    Invité(e)
    Par défaut
    Ca pourrait etre une methode libre (mais alors tu ne pourrais pas utiliser la variable statique) ce qui permet de ne pas alourdir la classe.

    Ici le code est inliné par simplicité, normalement on ne verrait que la declaration.

    Moi je fais souvent comme ca mais bon, je force personne a faire de même

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    37
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 37
    Par défaut
    Eheh ok merci, alors je vais m'employer a appliquer cette solution dans mon code.

  6. #6
    Membre émérite
    Avatar de Ekleog
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 448
    Par défaut
    Une autre solution plus réutilisable :
    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
    // Partie réutilisable, dans un fichier helpers.hpp ?
    std::string int2str(int i) {
        std::ostringstream oss;
        oss << i;
        return oss.str()
    }
     
    // Partie utilisation
    class CContenant
    {
    private:
        static int compteur_instance;
        CContenu m_contenu;
     
    public:
        CContenant(std::string message)
            : m_contenu(int2str(compteur_instance) + message)
        {
            CContenant::compteur_instance++;
        }
    };
     
    CContenant::compteur_instance=0;

Discussions similaires

  1. Réponses: 2
    Dernier message: 21/01/2015, 19h29
  2. Réponses: 3
    Dernier message: 06/07/2007, 09h17
  3. Réponses: 4
    Dernier message: 20/07/2006, 10h35
  4. Réponses: 3
    Dernier message: 13/06/2006, 16h36
  5. [VBA] utiliser une macro contenue dans un autre classeur
    Par laloune dans le forum Macros et VBA Excel
    Réponses: 20
    Dernier message: 01/02/2006, 18h46

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