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 :

pblm de compréhension sur les référence en


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 111
    Par défaut pblm de compréhension sur les référence en
    Bonjour,

    De ma compréhension du c++ ce code devrait toujours être faux

    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
     
    class E {...}
    E e;
     
    class B {
    E e1;
    void set(const E& e2)
    {
      e1=e2;
    }
    }
     
    main(...)
    {
     ...
     B b;
     b.set(e);
    ....
    }
    Un code dans ce style où j'affectais une référence à une variable en normal (je ne sais pas comment on dit) a provoqué une erreur à l'exécution pas à la compilation. Donc je me demande si c'est une erreur d'écrire ca ou mon plantage était dû à autre chose. J'ai résolu le problème en élimant la référence dans l'argument de la méthode. Si c'est une erreur de mettre une référence ici est-ce que ca l'est toujours, par exemple avec des type de base comme int,...

    Merci d'avance de vos réponses

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Salut,

    Non ce n'est pas une erreur que d'écrire ça, par contre ton problème peut venir de la manière dont sont implémentés constructeur de copie et opérateur d'affectation de ta classe E.
    Et donc sans plus d'informations sur cette classe il est difficile de diagnostiquer...

    En général on passe les types de base par copie et les types utilisateurs par const &.

    MAT.

  3. #3
    Membre expérimenté
    Profil pro
    Dev
    Inscrit en
    Décembre 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Décembre 2007
    Messages : 191
    Par défaut
    le problème pourrait aussi être que des fonctions et données dans une classe sont private par défaut.

    donc la fonction void set( const E& ) est membre privé de B et ne peut peut pas etre appelée de main() ou d'une autre fonction non membre de B .

    il faudrait donc faire :

    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
     
     
    ...
     
    class B {
      private:
      E e1;
     
      public:
      void set(const E& e2)
      {
        e1=e2;
      }
     
    }
     
    ...

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 111
    Par défaut
    Si c'est écriture n'est pas fausse le problème vient en effet de mon opérateur d'affectation ou le constructeur de copie à mon avis. Je n'ai pas rédéfini l'opérateur d'affectation dans la class E. Cepedant à priori le constructeur de copie fonction correctement. La class E ce présente en gros ainsi:

    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
     
    class C
    {
     // avec constructeur de copie
     // sans opérateur d'affectation surchargée
    }
     
    class E
    {
    private:
     vector<C> c1;
     string a;
     int b;
    public:
     E(const E& e){...}
    // sans opérateur d'affectation surchargée
    }

  5. #5
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Ok, mais comment est implémenté ce constructeur par copie ?
    En général constructeur par copie et opérateur d'affectation vont ensembles : si tu définies l'un il vaut mieux définir l'autre (d'ailleurs souvent on implémente l'opérateur d'affectation avec un temporaire construit par copie).
    Mais en fait pourquoi redéfinir l'opérateur par copie ? Celui généré par le compilateur n'allait pas ?

    Et pour la classe C ?
    Parce que les éléments du vecteur vont être recopiés du coup lors de la copie de E, et la même question va se poser...

    Ca irait plus vite à diagnostiquer si tu montrais ton vrai code à mon avis.

    MAT.

Discussions similaires

  1. Question sur les références.
    Par AsmCode dans le forum C++
    Réponses: 5
    Dernier message: 21/02/2007, 19h57
  2. Encore une question sur les références
    Par bouba dans le forum C++
    Réponses: 7
    Dernier message: 19/02/2007, 14h16
  3. Question sur les références
    Par vdumont dans le forum C++
    Réponses: 7
    Dernier message: 05/05/2006, 01h49
  4. [Smarty] problème compréhension sur les tableaux
    Par mohican13 dans le forum Bibliothèques et frameworks
    Réponses: 11
    Dernier message: 09/02/2006, 16h44

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