Class [C++]
Répondre à la discussion
Page 1 sur 2 1 DernièreDernière
Affichage des résultats 1 à 30 sur 35

Class [C++]



  1. #1
    yazeero

    Class [C++]


    ------

    Bonsoir les gens de programmation C++.

    j'ouvre la discussion par ce code:
    Code:
    void  Chaine::copyFromChaine(const Chaine& ch, int nbreChar){
    
         Chaine(ch.str,nbreChar);
    }
    Une méthode d'une classe "Chaine" de type VOID, à l'intérieure de cette dernière j'appel le constructeur de copie pour copier d'une chaine à ma chaine courante.

    Mais quand j'affiche le résultat, ma classe reste la meme. Bon j'ai trouvé une petite solution a mon problème:

    Code:
    void  Chaine::copyFromChaine(const Chaine& ch, int nbreChar){
    
         *this = Chaine(ch.str,nbreChar);
    }
    Mais comme tout le monde sait, le constructeur ne retourne rien.
    Est qu'il y a une explication de ça?
    Merci d'avance

    -----

  2. #2
    Paraboloide_Hyperbolique

    Re : Class [C++]

    Bonjour,

    Je ne suis pas spécialiste du C++ (juste un amateur éclairé), mais je pense que vous ne pouvez pas faire ce que vous faites. En effet, l'objet (*this) est déjà construit au moment où vous appelez la fonction "copyFromChaine". Il me semble donc que vous ne pouvez plus appeler de constructeur dessus. Il y a peut être moyen de bidouiller (et là je suis incompétent) mais je ne recommanderais pas de le faire.

    Je crois qu'il vaudrait mieux faire appel à un fonction privée "initiliaze" qui s'occupera de la copie des variables privées et qui pourra être appelée aussi bien par le constructeur de copie que votre fonction membre "copyFromChaine".

  3. #3
    Jack
    Modérateur

    Re : Class [C++]

    Chaine(ch.str,nbreChar);Est-ce bien un appel au constructeur de recopie?A+

  4. #4
    yazeero

    Re : Class [C++]

    Je vais te répondre par une petit programme et son résultat:

    Code:
    #include<iostream>
    
    using namespace std;
    
    class Machin{
        int x;
    public:
        Machin(int t){   //constructeur
            x=t;
            cout<<"Constructeur\n";
        }
    
        Machin  fct1(const Machin& m){
           return Machin(m.x);//x=m.x;
        }
        void    fct2(const Machin& m){
            Machin(m.x);//x=m.x;
        }
        void    fct3(const Machin& m){
            *this = Machin(m.x);//x=m.x;
        }
        void    afficher(){
            cout<<"Machin = "<<x<<endl;
        }
    };
    
    int main(){
    
        Machin m(4),n(5),p(8);
        m.afficher();
    
        m.fct2(n);//  m.x n'est pas modifié
        m.afficher();
    
        m=m.fct1(n);// m.x est modifié
        m.afficher();
    
        m.fct3(p);//  m.x est modifié
        m.afficher();
    
    return 1;
    }
    Résultat:
    Nom : Sans titre.jpg
Affichages : 71
Taille : 51,6 Ko

    Je peux appeler le constructeur dans une méthode d'une classe sans aucun problème, c'est déja fait avec notre enseignant.

  5. A voir en vidéo sur Futura
  6. #5
    yazeero

    Re : Class [C++]

    Jack: c'est un constructeur qui copie un nombre de caratére de la chaine passé en paramétre à ma chaine courante (appelé).

  7. #6
    Jack
    Modérateur

    Re : Class [C++]

    Un constructeur oui, mais de copie, pas sûr.

    Le constructeur de copie en C++ n'a-t-il pas besoin d'une référence sur l'objet modèle?

    A+

  8. #7
    yazeero

    Re : Class [C++]

    désolé mais j'ai pas bien compris votre question.

    j'ai utilisé les références dans les constructeurs pour ne pas créer une copie de l'objet.

  9. #8
    Jack
    Modérateur

    Re : Class [C++]

    En principe, on doit trouver dans le constructeur de copie une référence sur un objet de la classe, ce que je ne vois pas dans votre constructeur.

  10. #9
    yazeero

    Re : Class [C++]

    c'est au niveau de la classe Machin?

  11. #10
    Jack
    Modérateur

    Re : Class [C++]

    Non. Dans ce code:

    Chaine(ch.str,nbreChar);

    je ne vois pas de référence sur un objet de la classe Chaine. Donc je me dit qu'il ne s'agit pas d'un appel du constructeur de copie.

  12. #11
    yazeero

    Re : Class [C++]

    ah!!
    Désolé.
    Pour ce constructeur, il permet de copier des caractères d'un tableau de char, dans mon tableau de la classe Chaine.

    Mais le problème au niveau de la différence entre *this = constructeur(); cette expression ça marche très bien meme si le constructeur ne retourne rien. mais si vous voyez le programme de la classe Machin , la "fct2". elle permet de copier la valeur passé (m.x) à la valeur x de notre objet en appelant le constructeur. Mais juste au niveau de la fonction. Après son exécution la valeur x reste la meme.

  13. #12
    Jack
    Modérateur

    Re : Class [C++]

    Effectivement, je n'avais pas fait attention à cette possibilité

  14. #13
    fred1599

    Re : Class [C++]

    Code:
    void    fct2(const Machin& m){
            this->x = m.x;
        }
    Non??? Ou j'ai pas compris ce que tu souhaitais...

  15. #14
    fred1599

    Re : Class [C++]

    Je suis même pas sûr que x = m.x (sans le this) ne fonctionne pas aussi

  16. #15
    yazeero

    Re : Class [C++]

    Conecrnant la "class Machin" est seulement pour simplifier les choses et montrer la différence quand j'appelle le constructeur de différente manière :

    fct1: type Machin retourne le constructeur. x de Machin est modifié si j'affecte le résultat retourne à la classe Machin. (voir le main).

    fct2 : type void. J'appelle le constructeur, mais la modification se fait au niveau de la fonction après qu'on sort x à son ancienne valeur.

    fct3 : type void, mais au-dedans j'ai appelé le constructeur et je l'ai affecté à ma classe Machin ( *this=constructeur (); ).

    Qu'est-ce que vous pensez?

  17. #16
    yazeero

    Re : Class [C++]

    Une explication si possible?

  18. #17
    fred1599

    Re : Class [C++]

    Qu'est-ce que tu veux faire? Modifier l'attribut de ton objet? Sois plus explicite, depuis le début de ce post je n'arrive pas à comprendre exactement ce que tu souhaites faire.

  19. #18
    yazeero

    Re : Class [C++]

    Oui, je veux modifier l'attribut de mon objet par le constructeur.
    Dernière modification par yazeero ; 20/01/2013 à 16h55.

  20. #19
    fred1599

    Re : Class [C++]

    ça veut pas dire grand chose constructeur, là on parle objet, tu veux changer l'attribut de l'objet par le biais de l'attribut d'un autre objet. Dans ce cas, la fonction correcte est celle-ci

    Code:
    void    fct2(const Machin m){
            x = m.x;
        }
    Pas besoin de référence, pas besoin de this, je touche pas trop au C++, mais si mes souvenirs sont bons...

  21. #20
    yazeero

    Re : Class [C++]

    Merci pour cette réponse.
    Malheureusement tu n'a pas compris ce que je veux dire.
    J'ai écris que cet exemple "class Machin" est pour simplifier le principe de cette discussion.
    J'ai un projet en c++ une méthode qui va copier le tableau de char dans ma classe. A la place de récrire le code de constructeur qui peut faire ce travail, je l'appel au-dedans de ma méthode avec cette manière ( *this = constructeur(); ).
    Mais le constructeur comme tout le monde sait, il ne retourne rien.
    je veux savoir pourquoi ça fonctionne et comment?


    (la référence nous permet d'optimiser la mémoire.)

  22. #21
    fred1599

    Re : Class [C++]

    Ecoute le plus simple est d'envoyer ta classe Chaine

    car

    1) "copier un tableau de char dans une classe", ça veut rien dire (pourquoi pas un string beaucoup plus safe, et pas attribut plutôt que classe???)
    2) "A la place de réécrire le code du constructeur" veut rien dire non plus "*this = constructeur()" du coup je vois pas le rapport avec l'attribut.
    3) "le constructeur comme tout le monde le sait ne retourne rien", tu veux sûrement dire qu'on utilise pas le mot clé return?

    Pourquoi ça fonctionne? Je ne sais pas, car tu mélanges attributs et classe, constructeur avec attribut, et this l'autoréférence ne sert à rien.

    "La référence nous permet d'optimiser la mémoire"

    Pour ce genre de projet? Avec les machines actuelles?

    Bref sois tu es plus précis, tu nous donnes des exemples, ce que tu attends comme résultat, soit on ne pourra rien faire pour toi.

    Tu veux faire de l'OO (orienté objet), alors c'est que tu as eu des cours, soit plus précis dans tes termes.

  23. #22
    yazeero

    Re : Class [C++]

    Mon principe ce n'est pas comment copier un tableau de char ou comment je peux modifier mes attributs.
    le problème c'est l'explication de cette expression [*this = constructeur();] . C'est comme on créé une nouvelle classe et on l'affecte à la tienne.

    J'ai une dernière question à vos poser à propos du constructeur :

    Est qu'il retourne une classe?
    Si vos dites non, essayez donc cette instructions dans une méthode (cout<<&construceur(). Vous allez constater qu'il affiche une addresse d'une classe et vous pouvez afficher sa contenu par une méthode afficher(){...}; (constructeur().afficher()

    J'espère que vous m'avez compris.
    Merci et je suis désolé pour l'illisibilité.
    A+

  24. #23
    fred1599

    Re : Class [C++]

    le problème c'est l'explication de cette expression [*this = constructeur();] . C'est comme on créé une nouvelle classe et on l'affecte à la tienne.
    Je ne sais pas, jamais vu cette expression, ça ressemble plus à un coup de bol, je ne connais rien dans la POO ressemblant à cela.

    Pour recréer une classe on utilise les métaclasses, ce que 99,99% n'utiliseront jamais. "un nom très connu avait sorti cette phrase".

    Code:
    cout<<&construceur()
    Code:
    cout << this;
    suffit, et est bien plus logique car this représente l'objet et tout ce qui est lié avec, le constructeur n'ayant aucun rapport avec l'objet, il représente la méthode pour initialiser (créer un objet à l'aide de paramètres).

    Maintenant si tu parles de constructeur de recopie, dans ce cas il doit être de la forme Chaine(Chaine &) ou Chaine(const Chaine &).
    Si tu places ce constructeur de recopie en privé, il est appelable que par les fonctions membres de la classe.
    Donc toute recopie d'objets par l'utilisateur de la classe t'amèneras à une erreur de compilation, si tu veux palier à ce problème, il devra s'agir d'un constructeur public.

  25. #24
    yazeero

    Re : Class [C++]

    Code:
    void fct(const Machin& m){
    
    *this = Machin(m.x);
    }
    Equivalent à:

    Code:
    void fct(const Machin& m){
    
    Machin A(m.x);
    *this =  A;
    }

  26. #25
    fred1599

    Re : Class [C++]

    pourquoi *this et pas this simplement?

    Pourquoi pas this=m?

  27. #26
    yazeero

    Re : Class [C++]

    "pourquoi *this et pas this simplement? ". Une affectation tout simplement, je ne pointe pas sur le la classe "m" (elle peut etre supprimer aprés).
    "Pourquoi pas this=m?". Pour ce cas je confirme que ça marche. Prenant le cas de mon projet; J'ai un constructeur qui copie dans ma chaine applante un nombre de char d'un tableau "chaine(char t[],nbreChar)". il y a d'autres constructeurs pour autre choses (surcharge). J'ai des fonctions membres qui font la mm choses, alors je ne vais pas m'amuser à refaire ou copier le code. J'ai décidé d'appeler le constructeur dans la méthode qui convient.
    Et voila à la place de creer une autre chaine et l'initialiser avec ces constructeurs, j'affecte directement à mon objet courant (*this) l'objet retournant par le constructeur.

  28. #27
    Chanur

    Re : Class [C++]

    Bonjour,
    Et si tu prenais le problème dans l'autre sens : tu as raison de ne pas vouloir dupliquer le code, mais il suffirait que tu écrives une méthode qui copie correctement ton tableau et que le constructeur appelle cette méthode. Il me semble que ce serait plus clair et le résultat serait le même.
    Parce que la syntaxe *this = Machin (m.x) me paraît très étrange (mais tu as raison, ça marche, je l'ai vérifié : je ne crois que ce que je vois ).
    Ce qui se conçoit bien s'énonce clairement ; et les mots pour le dire arrivent aisément.

  29. #28
    yazeero

    Re : Class [C++]

    Dans tous les cas, un constructeur retourne une classe initialisé avec ses paramètres.
    Pour l'expression *this=constructeur(); c'est tout simplement une réinitialisation de ma classe parce que ma méthode est de type VOID. Si elle était de type [nom_classe] je retourne ma le constructeur() et j'affecte le résultat à mon objet courant.
    Merci

  30. #29
    Dlzlogic

    Re : Class [C++]

    Bonjour,
    Moi, ce qui m'étonne un peu, c'est qu'il n'y a pas de création d'objet avec new.
    J'ai très peu utilisé this, et seulement dans des cas très particuliers.
    Si vous faites this=...; dans une classe vous modifiez le pointeur sur l'objet, donc en gros, vous faites n'importe quoi.
    D'ailleurs, je ne sais pas si mon compilateur accepterait this='n'importe quoi';
    Si vous faites un copie, il doit y avoir un autre objet.
    Mais ce n'est que mon avis.

  31. #30
    Jack
    Modérateur

    Re : Class [C++]

    je crois qu'il ne s'agit pas ici de "this =", mais de "*this =".

    A+

Page 1 sur 2 1 DernièreDernière

Discussions similaires

  1. uml diagramme de class
    Par invitef60b1661 dans le forum Programmation et langages, Algorithmique
    Réponses: 0
    Dernier message: 30/03/2011, 13h33
  2. Appel de class
    Par bird12358 dans le forum Logiciel - Software - Open Source
    Réponses: 17
    Dernier message: 22/02/2010, 08h45
  3. C++ et class
    Par bird12358 dans le forum Logiciel - Software - Open Source
    Réponses: 9
    Dernier message: 14/02/2010, 21h06
  4. class factory
    Par invite57bafb2c dans le forum Logiciel - Software - Open Source
    Réponses: 2
    Dernier message: 28/11/2003, 17h19