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 :

Mise à jour attribut classe mère et initialisation


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 41
    Par défaut Mise à jour attribut classe mère et initialisation
    Bonjour,

    Je fais du polymorphisme avec différentes zones climatiques. J'ai donc une classe mère "TerrainZone" avec des filles telles que "Chaud", "Froid" etc.

    Toutes ces zones ont un nombre d'arbre à un moment donné. Je calcule leur densité grâce au même calcul donc j'ai mis cette fonction dans la classe mère et l'attribut "nbArbres" aussi.

    Ma classe mère est abstraite, elle dispose de 4 fonctions virtuelles pures.

    Deux questions:

    1) Pourquoi l'initialisation directement dans les attributs de la classe mère n'est-elle pas prise en compte ? Je dois donc passer par le constructeur de ma classe fille pour les initialiser.

    2) Pourquoi le destructeur d'un objet hérité est appelé à sa construction ?

  2. #2
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 58
    Par défaut
    salut,

    je peut peut être t'aider sur la première question mais la deuxième pas trop je débute en c++ donc je suis pas encore expert

    donc tu à des classes comme sa :
    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
          class  TerrainZone{
    		public:
     
    			TerrainZone() : nbArbres(0){
                                Calcule(); // <- je sais pas si tu la mis ici ou non
                            }
    		        ~TerrainZone(){}
     
                     virtual void Calcule() = 0;
                     virtual void function2() = 0;
                     virtual void function3() = 0;
                     virtual void function4() = 0;
     
                     protected :
                          int nbArbres;
    	};
     
              class  Chaud : public TerrainZone{
    		public:
     
    			Chaud () : TerrainZone(){
                                Calcule();
                            }
    		         ~Chaud (){}
     
     
                     virtual void function2(){
                         //...
                     }
                     virtual void function3(){
                         //...
                     }
                     virtual void function4(){
                         //...
                     }
     
    	};
     
            class  Froid: public TerrainZone{
    		public:
     
    			Froid() : TerrainZone(){ // <- ici le constructeur du parent est appeler
                                 Calcule();
                            }
    		        ~Froid(){}
     
     
                     virtual void function2(){
                         //...
                     }
                     virtual void function3(){
                         //...
                     }
                     virtual void function4(){
                         //...
                     }
     
    	};
    je sais pas le code exacte que tu à donc j'en est déduit ceci mais si tu peut montrer un peu de code sa pourrai aidé.

    Normalement si la classe parent possède des argument il faut également les passer dans le constructeur fille si tu veut que sa se fasse à l'initialisation.

    si tu veut appeler une fonction d'un parent dans le code fille tu peut également faire si je me rappel bien ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        Parent::taFonction(/* avec des argument ou non*/); // <- Parent = Classe de base
    mais normalement si ta fonction n'est pas en private les classe fille doit avoir accès également à cette fonction directement comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        Ta fonction(/*avec argument ou non*/);

  3. #3
    Membre chevronné Avatar de fenkys
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    376
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 376
    Par défaut
    Citation Envoyé par j_sb12 Voir le message

    1) Pourquoi l'initialisation directement dans les attributs de la classe mère n'est-elle pas prise en compte ? Je dois donc passer par le constructeur de ma classe fille pour les initialiser.

    2) Pourquoi le destructeur d'un objet hérité est appelé à sa construction ?
    Parce que tu as mal fait quelque chose. Mais quoi ? Ma boule de divination étant en panne, tu devrais peut être nous aider en nous donnant ton code.

  4. #4
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Parce que tu n'as pas utilisé la liste d'initialisation du constructeur.

  5. #5
    Membre Expert
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Par défaut
    Hello,

    Citation Envoyé par j_sb12 Voir le message
    Deux questions:

    1) Pourquoi l'initialisation directement dans les attributs de la classe mère n'est-elle pas prise en compte ? Je dois donc passer par le constructeur de ma classe fille pour les initialiser.

    2) Pourquoi le destructeur d'un objet hérité est appelé à sa construction ?
    Çà sent la copie inutile avec un mauvais ctor par copie (ou mauvais opérateur=). Mais sans code, c'est dur de deviner.

    @ksta.k, ne pas oublier le dtor virtuel dans Terrain

  6. #6
    Membre émérite Avatar de PadawanDuDelphi
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2006
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2006
    Messages : 678
    Par défaut
    Citation Envoyé par j_sb12 Voir le message
    Bonjour,
    2) Pourquoi le destructeur d'un objet hérité est appelé à sa construction ?
    Il ne l'ai pas à priori. Mais je pense que le problème 1) découle du 2) puisqu'il est tout à fait possible d'initialiser les membres de la classe mère dans la classe mère...
    C'est tout le principe de l'héritage, imagines sinon les problèmes pour les gens qui utilisent de grosses classes externes.

    Il faudrait voir le code pour comprendre.

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 58
    Par défaut
    @Iradrille : En effet j'ai pas d'excuse sur ce coup la

    Donc il faut mettre le destructeur virtuel et sa devrais fonctionner avec le petit exemple

  8. #8
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    pas de code, pas de solution.

    Tu vois un rapport entre la virtualité du destructeur et un problème dans le constructeur?

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    Et avoir une class Chaud : public TerrainZone ça n'a aucun sens amha.
    Ce devrait être un simple attribut type enum pour définir ça.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  10. #10
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 41
    Par défaut
    Bonjour,

    Je suis vraiment désolé de répondre maintenant mais je ne recevais plus les notifications de nouveaux messages. du coup je ne pensais plus à regarder ce thread. J'ai développer sans ces features et en me rappelant de ce soucis, je suis revenu ici.

    Finalement, mon deuxième soucis (concernant le destructeur) est réglé. Je ne sais pas comment par contre. j'ai retesté et au final cela fonctionne. Depuis le début mes destructeurs étaient virtuels.

    L'initialisation dans la classe mère même si elle est virtuelle pure est censée fonctionner non ? J'ai encore un petit soucis là dessus.

    Pour ta remarque Bousk, non je n'ai pas développé comme cela car je fais une simulation en procédural avec des races d'arbres (c'est un projet pour l'université). Du coup dans mes boucles j'utilise un type général qui est Tree. Idem pour les zones. Dans mes classes filles je n'ai que des attributs (spécificités de chaque race ou zones) que je passe au constructeur de la classe mère. Vu que ce n'est QUE des Get ou Set, j'ai préféré déléguer toutes les fonctions à la classe mère.

Discussions similaires

  1. Attribut classe mère initialisé dans dérivées
    Par sone47 dans le forum Langage
    Réponses: 9
    Dernier message: 07/01/2013, 16h36
  2. Mise à jour des classes
    Par Nelfou dans le forum BOUML
    Réponses: 4
    Dernier message: 11/06/2009, 10h41
  3. IE bug sur mise à jour attribut onclick en js
    Par andong dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 22/08/2007, 13h58
  4. Mise à jour de l'attribut "class"
    Par Bruno2000 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 07/09/2006, 08h00
  5. Réponses: 1
    Dernier message: 27/04/2006, 18h22

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