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

Qt Discussion :

QObject et constructeur de recopie


Sujet :

Qt

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 7
    Par défaut QObject et constructeur de recopie
    Bonjour, j'ai le problème suivant : je crée une classe qui dérive de QObject, et j'aimerais redéfinir le constructeur de recopie ainsi que l'opérateur d'affectation. Or il se trouve qu'ils sont définit comme private dans QObject. Existe-t'il un moyen de résoudre ce problème ?

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 52
    Par défaut
    Excuse moi, je ne peux pas repondre à ta quéstion, enfin pas que je sache, je ne comprend pas bien ce qu'est un constructeur par recopie? Est ce qu'il s'agit d'une constructeur avec de quoi modifier tous les attribus de la classe en paramètre? En fait j'ai pas des vrai cours alors je connais pas les vrais tèrmes...

  3. #3
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    Si les méthodes sont vituelles tu devrai pouvoir (en tout cas de souvenir). Sinon, ça va poser peut être quelques soucis.

    Mais dis moi si je me trompe (il y a longtemps que je n'ai pas fait de C++), si les membres sont privés, ils ne sont pas hérités, donc par conséquent pour ta classe fille, tu n'a pas à "redéfinir" le constructeur et l'opérateur d'affectation mais tu as à les définir (puisque qu'ils n'ont pas été hérités)

  4. #4
    Membre éprouvé Avatar de hansaplast
    Homme Profil pro
    Artisant logiciel
    Inscrit en
    Septembre 2005
    Messages
    951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Artisant logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 951
    Par défaut
    bein AMHA, soit tu modifie les sources pour les mettre en public, soit tu peut po...

    a part si tu crée un constructeur en virtual et que tu appel ton propre constructeur, et celui de qt ensuite...

    enfin, je debute plus que toi, donc c a prendre avec des pincettes...

  5. #5
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    S'ils sont déclarés privés c'est certainement justement pour empêcher qu'on les définisse au niveau des classe filles. Il semble assez logique que des classes de contrôles ne puissent pas être copiables.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 7
    Par défaut
    Salut. Merci à ceux qui ont pris la peine de me répondre, même si en fait j'ai eu en retour plus de questions que de réponses Je vais essayer de répondre mais ne il ne faut pas prendre tous ce que je dis/écris pour parole d'évangile (en gros je ne suis pas hyper super mega sur de moi).

    Coelacanthe : en fait un constructeur de copie/recopie (les deux termes s'emploient) sert à créer une copie d'un objet (un clone). Il est utilisé (entre autre) implicitement à chaque fois que tu passes ton objet comme paramètre d'une fonction.

    Promu@ald : les membres private sont bien hérités (heureusement!), le seul problème c'est que tu n'y as pas accés, mais cela n'empêche pas de les redéfinir. Un petit exemple :
    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
    42
    43
    44
    45
    46
    47
     
    include <iostream>
     
    class A
    {      
     public:
     A(int v):valeur(v){};
     int getCarre();
     int valeur;
     
     private :      
     virtual int puissance(unsigned int);
     };
     
    class B : public A
    {
    public :
    B(int v):A(v){};
    virtual int puissance(unsigned int);
    };
     
    int A::puissance(unsigned int n) 
    {
    if (n==0) return 1;
    int result = valeur;
    for (int i=1; i<n; ++i)
         result *= result;
    return result;}
     
    int B::puissance(unsigned int n)  
    {
    return valeur*n; 
    }  
     
    int A::getCarre()
    {
    return puissance(2);
    }
     
    int main()
    {
    A* a = new A(10);
    B* b = new B(10);
    std::cout<<a->getCarre()<<std::endl;
    std::cout<<b->getCarre()<<std::endl;
    return 0;
    }
    à l'exécution ce code va afficher :
    >> 100
    >> 20
    donc il y a bien eu redéfinition de la méthode puissance(int) qui par contrecoup a affecté la méthode getCarre()...
    Mais c'est vrai que l'on ne "redéfinit" pas un constucteur. En fait dans ma phrase originelle, redéfinir avez dans mon esprit le sens de "remplacer ceux fournis par défaut" . C'est je suppose une déformation professionnelle.

    Hansaplast : modifié les sources m'a traversé l'esprit... et j'en ai mauvaise conscience! Pour le coup du constructeur virtual : j'ai pas tous compris.

    Loulou24 : merci de m'avoir enlever les maigres espoirs que j'avais

  7. #7
    Membre émérite

    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 634
    Par défaut
    Citation Envoyé par ionnn
    modifié les sources m'a traversé l'esprit... et j'en ai mauvaise conscience! Pour le coup du constructeur virtual j'ai pas tous compris.
    Normalement tu ne devrais jamais avoir à faire ça. Si ta bibliothèque est faite de telle manière, c'est que tu n'est sûrement pas sur le bon chemin. Je pense que pour ton problème tu dois pouvoir faire autrement non? Pourquoi aurais-tu besoin de le copier ou de le passer en paramètre d'une fonction?

    Oublie le coup du constructeur virtuel. Un constructeur n'est jamais défini comme virtuel.

  8. #8
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Les objets dérivés de QObject sont des objets à sémentique d'entité, et non de valeur. Il est classique dans ces cas là que les objets soient non copiables, et destinés à être gérés pas des pointeurs.

    Pour résoudre ton problème, sans en savoir plus j'hésite entre :
    - Ton objet n'a pas en fait à être copiable
    - Faire dériver ta classe de QObject, voilà l'erreur
    - Tu peux créer dans ta classe une fonction createTwin qui créera un objet semblable au premier, mais différent (tu crées un nouvel objet, puis tu recopie les variables membres qui t'intéressent de l'un à l'autre, mais la partie héritée de QObject en particulier sera spécifique).
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  9. #9
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    Sans contournements à prévoir dès le début:
    Héritage public => sémantique de référence => pas de copie possible, seul le clonage est envisageable avec un constructeur de recopie protégé et opérateur d'affectation interdit.

    Si tu veux faire des copies,
    - soit erreur de débutant (/non initié) que de croire qu'il faut toujours systématiquement définir constructeur de recopie et opérateur d'affectation -- cf d'ailleurs l'erreur de design dans tes deux classes A et B par rapport à la façon dont tu les manipules.
    - soit ton problème doit être repensé. Es-tu réellement sûr que ton nouveau type est bien un sous type de QObject ? Que tu pourras toujours subtituer sans rompre aucun contrat (pré-, post-conditions, invariants, ...) un objet fils là où il est attendu un QObject ?

    Il faudrait connaitre QT pour mieux voir ce que tu pourrais faire ici. Et probablement savoir pourquoi tu veux dériver un truc que tu pense devoir être copiable. Je passe la main à ceux qui le manipulent. Ne peux-tu partager tes objets plutôt que de provoquer des recopies profondes ?
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  10. #10
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Citation Envoyé par Fiquet
    Oublie le coup du constructeur virtuel. Un constructeur n'est jamais défini comme virtuel.
    Il existe un idiome dit du "constructeur par recopie virtuel", mais ce n'est pas un constructeur, mais une fonction clone. C'est généralement très utile quand on a une hiérarchie de classe, car un contructeur de recopie ne marche pas dans ce cas.

    Dans ce cas précis, on ne peut pas utiliser cet idiome, mais ma fonction createTwin s'en approche.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  11. #11
    Membre émérite

    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 634
    Par défaut
    Intéressant. C'est de ça dont tu parles ?

    Car en fait si j'ai bien compris c'est impossible de faire une copie avec hiérarchie de classe grace à un constructeur de recopie "normal" ?

  12. #12
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Oui, c'est ça. Le problème d'un constructeur, c'est qu'on doit connaître le type exact de l'objet à construire. Dans une hiérarchie, ce n'est pas souvent le cas pour une copie d'objet, et l'on ne connaît l'objet que par un pointeur sur le type de base.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  13. #13
    Membre émérite

    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 634
    Par défaut
    D'accord merci du renseignement .

Discussions similaires

  1. [Débutant] Constructeur par recopie pour TComponent
    Par Runlevel dans le forum C++Builder
    Réponses: 9
    Dernier message: 06/05/2006, 16h58
  2. constructeur de recopie et héritage
    Par r0d dans le forum C++
    Réponses: 11
    Dernier message: 08/02/2006, 09h47
  3. Constructeur par recopie
    Par KernelControl dans le forum C++
    Réponses: 2
    Dernier message: 29/12/2005, 12h24
  4. constructeur de recopie:question theorique
    Par voyageur dans le forum C++
    Réponses: 7
    Dernier message: 02/12/2004, 22h46
  5. Constructeur par recopie
    Par sdebrois dans le forum Composants VCL
    Réponses: 13
    Dernier message: 21/10/2004, 14h47

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