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 :

J'ai besoin de deux constructeurs par copie avec une liste d'initialisation différent


Sujet :

C++

  1. #21
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 627
    Points : 30 692
    Points
    30 692
    Par défaut
    Salut,

    Tu dois séparer la lecture des informations dans le fichier et la création de tes objets.

    Tu ne dois donc pas créer un constructeur par copie, mais bel et bien un constructeur qui prenne les informations dont tu dispose

    Ensuite, si dans titi.txt, tu as les informations dans un ordre donné (comme par exemple)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nom prenom age sexe bidule
    et que dans toto.txt, tu as les mêmes informations, mais dans un autre ordre (comme par exemple)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    prenom age sexe bidule nom
    il "suffit" de faire lire les informations dans l'ordre réel, avant d'appeler le constructeur (même si on peut discuter du fait que cette situation n'est arrivée que parce que tu a sans doute loupé quelque chose en conception )

    Cela pourrait se faire sous une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    CFauxFrere* lectureFichier(const std::string& fname)
    {
        std::ifstream ifs(fname.c_str());
        std::string nom;
        std::string prenom;
        int age;
        char sexe;
        std::string bidule;
        if( fname=="titi.txt";)
            ifs >> nom >> prenom >> age >> sexe >> bidule;
        else
            ifs >> prenom >> age >> sexe >> bidule >> nom;
        return new FauxFrere(nom, prenom, age, sexe, bidule);
    }

  2. #22
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Salut,

    Tu dois séparer la lecture des informations dans le fichier et la création de tes objets.

    Tu ne dois donc pas créer un constructeur par copie, mais bel et bien un constructeur qui prenne les informations dont tu dispose

    Ensuite, si dans titi.txt, tu as les informations dans un ordre donné (comme par exemple)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nom prenom age sexe bidule
    et que dans toto.txt, tu as les mêmes informations, mais dans un autre ordre (comme par exemple)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    prenom age sexe bidule nom
    il "suffit" de faire lire les informations dans l'ordre réel, avant d'appeler le constructeur (même si on peut discuter du fait que cette situation n'est arrivée que parce que tu a sans doute loupé quelque chose en conception )

    Cela pourrait se faire sous une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    CFauxFrere* lectureFichier(const std::string& fname)
    {
        std::ifstream ifs(fname.c_str());
        std::string nom;
        std::string prenom;
        int age;
        char sexe;
        std::string bidule;
        if( fname=="titi.txt")
            ifs >> nom >> prenom >> age >> sexe >> bidule;
        else
            ifs >> prenom >> age >> sexe >> bidule >> nom;
        return new FauxFrere(nom, prenom, age, sexe, bidule);
    }
    Salut Koala,

    Merci pour tes précieux conseils.

    Je vais relire ton message à mon aise et voir si je peux adapter mon programme comme tu le dis.

    Encore un grand merci.

    beegees

  3. #23
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 627
    Points : 30 692
    Points
    30 692
    Par défaut
    En fait, l'idée générale est toujours de retarder la création des objets jusqu'à ce que l'on dispose de toutes les informations nécessaires pour ce faire.

    Si les informations risquent d'arriver dans une ordre différent de celle dans laquelle on a prévu de les transmettre pour créer l'objet, il faut donc... attendre d'avoir l'ensemble avant de créer l'objet

    N'oublie pas que, contrairement au C, le C++ autorise la déclaration de variable ailleurs qu'en début de fonction... même s'il faut faire attention à la portée dans laquelle elles sont déclarées.

    Mais dans le pire des cas, il est sans doute possible de s'arranger pour déclarer des variables temporaires récupérées dans une portée (ici les blocs if et else) soient déclarée avant et pour créer l'objet "final" (qui utilise les variables temporaires fraichement récupérées) après la portée "de récupération"

  4. #24
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut
    Citation Envoyé par koala01 Voir le message
    En fait, l'idée générale est toujours de retarder la création des objets jusqu'à ce que l'on dispose de toutes les informations nécessaires pour ce faire.

    Si les informations risquent d'arriver dans une ordre différent de celle dans laquelle on a prévu de les transmettre pour créer l'objet, il faut donc... attendre d'avoir l'ensemble avant de créer l'objet

    N'oublie pas que, contrairement au C, le C++ autorise la déclaration de variable ailleurs qu'en début de fonction... même s'il faut faire attention à la portée dans laquelle elles sont déclarées.

    Mais dans le pire des cas, il est sans doute possible de s'arranger pour déclarer des variables temporaires récupérées dans une portée (ici les blocs if et else) soient déclarée avant et pour créer l'objet "final" (qui utilise les variables temporaires fraichement récupérées) après la portée "de récupération"
    Je suis entièrement d'aoccord avec ce que tu dis.

    Pour ce qui est de la portée, on peut peut être créer des variables globales mais pas bien

    Un tout grand et sincère merci pour ton aide hyper précieuse.

    beegees

  5. #25
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 627
    Points : 30 692
    Points
    30 692
    Par défaut
    Citation Envoyé par beegees Voir le message
    Je suis entièrement d'aoccord avec ce que tu dis.

    Pour ce qui est de la portée, on peut peut être créer des variables globales mais pas bien

    Un tout grand et sincère merci pour ton aide hyper précieuse.

    beegees
    Mais l'exemple que je viens de donner illustre mes propos...

    En effet, les std::string nom, prenom, bidule, le caractères sexe et l'entier age serviront de valeur pour créer ton objet.

    Il se fait que, si tu les déclarais dans le bloc if ou dans le bloc else, tu te retrouverais dans la situation suivante (outre le fait que cela t'oblige à écrire deux fois la même chose):
    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
    CFauxFrere* lectureFichier(const std::string& fname)
    {
        std::ifstream ifs(fname.c_str());
        std::string nom;
        std::string prenom;
        int age;
        char sexe;
        std::string bidule;
        if( fname=="titi.txt")
        {
            std::string nom;
            std::string prenom;
            int age;
            char sexe;
            std::string bidule;
            ifs >> nom >> prenom >> age >> sexe >> bidule;
        }//mince, les variable n'existent que jusqu'ici
        else
        {
            std::string nom;
            std::string prenom;
            int age;
            char sexe;
            std::string bidule;
            ifs >> prenom >> age >> sexe >> bidule >> nom;
        }//idem
        /* pas de bol, les variables ne sont pas connues dans cette portée-ci
        return new FauxFrere(nom, prenom, age, sexe, bidule);
        *sera donc refusé à la compilation 
        */
    }

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. [AC-2010] Filtrer les enregistrements par date avec une liste déroulante
    Par sardaucar dans le forum IHM
    Réponses: 7
    Dernier message: 19/11/2013, 19h13
  2. Réponses: 3
    Dernier message: 22/03/2011, 12h56
  3. [POO] constructeur de copie pour une liste
    Par oswalidos dans le forum C++
    Réponses: 8
    Dernier message: 29/10/2008, 09h39
  4. Constructeur par copie et std::list
    Par Captain_JS dans le forum SL & STL
    Réponses: 5
    Dernier message: 13/12/2005, 19h15
  5. [deb.]Constructeur par copie
    Par Marc_3 dans le forum Débuter
    Réponses: 4
    Dernier message: 19/11/2005, 13h33

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