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 :

Constructeur par défaut ?


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Décembre 2009
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 33
    Par défaut Constructeur par défaut ?
    Bonjour !
    J'ai un problème que mes connaissances en C++ n'expliquent pas :
    J'ai la classe suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class FluidParticles : public std::vector<FluidParticle> {
     
    public :
        FluidParticles(int nParticles, int X1, int X2, int Y1, int Y2);
     
     
    };
    Ainsi que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class ParticleSystem
       {
     
       private :
           bool m_wasMaxReached;
     
       public :
           FluidParticles Particles;
    [.....]
    Bref mon "ParticleSystem" contient un objet de classe "FluidParticles"

    Mon constructeur de ParticleSystem est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ParticleSystem::ParticleSystem(void)
    {        
            Particles       = FluidParticles(0,0,0,0,0);
        ...
    }
    Cependant j'ai comme erreur sous visual que la classe "FluidParticles" ne possède pas de constructeur par défaut...

    Donc je comprend pas trop ce que se passe. J'ai l'impression de comprendre qu'en fait je dois instancier mon champ "Particles" dès la déclaration dans le .hpp, mais à ce moment là comment faire? Vu qu'avant la construction les paramètres ne sont pas connus? (ils sont passés au constructeur)

    Bref je pige pas où est l'erreur ... en java ça marche !

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Moi je dirai que la classe std::vector possède un constructeur par défaut virtuel, donc le compilateur attend un constructeur par défaut pour la classe qui en hérite, même s'il n'est jamais appelé.

  3. #3
    Membre émérite
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Par défaut
    Citation Envoyé par lezebulon
    j'ai comme erreur sous visual que la classe "FluidParticles" ne possède pas de constructeur par défaut
    L'as-tu défini ? (le constructeur par défaut)

  4. #4
    Membre averti
    Inscrit en
    Décembre 2009
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 33
    Par défaut
    Citation Envoyé par Lucien63 Voir le message
    L'as-tu défini ? (le constructeur par défaut)
    Non, mais ça veut donc dire que je suis forcé de "construire" mon objet FluidParticles Particles avant l'appel du constructeur de ParticleSystem ?

    Un constructeur par défaut, ce serait un truc qui initialiserait mes valeurs à 0 et ne prendrait pas de paramètres?

  5. #5
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Doubs (Franche Comté)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    @Pierre Dolez: Un constructeur ne doit pas être virtuel, donc non.

    @OP: On n'hérite pas publiquement de std::vector<>, pas de destructeur virtuel. Et ca ne marche pas car tu définis un constructeur qui prend des arguments (sans valeurs par défaut), donc le constructeur trivial n'est pas généré, donc tu n'as pas de constructeur par défaut.

  6. #6
    Membre averti
    Inscrit en
    Décembre 2009
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 33
    Par défaut
    Citation Envoyé par Flob90 Voir le message
    @OP: On n'hérite pas publiquement de std::vector<>, pas de destructeur virtuel. Et ca ne marche pas car tu définis un constructeur qui prend des arguments (sans valeurs par défaut), donc le constructeur trivial n'est pas généré, donc tu n'as pas de constructeur par défaut.
    Donc comment je peux faire pour hériter de std::vector<> ? Je dois faire autrement?

  7. #7
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Doubs (Franche Comté)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    Tu ne le fais pas. Tu mets un attributs de type std::vector<> en privé. (l'héritage privé peut aussi être une solution)

  8. #8
    Membre averti
    Inscrit en
    Décembre 2009
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 33
    Par défaut
    Ok je vais faire ça alors,
    c'est juste que ça me paraissait plus élégant de faire ça que d'avoir une classe container contenant 1 attribut

  9. #9
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Doubs (Franche Comté)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    Déjà répondu :

    Citation Envoyé par Flob90 Voir le message
    Et ca ne marche pas car tu définis un constructeur qui prend des arguments (sans valeurs par défaut), donc le constructeur trivial n'est pas généré, donc tu n'as pas de constructeur par défaut.
    En privé le vecteur (cf encapsulation).

    Qu'entends tu par ré-instancier ?

    Si tu ne veus pas avoir à réécrire le constructeur, tu peus utilisé default (si ton compilo le supporte) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FluidParticles() =default;
    Sinon il te suffit de mettre un coprs vide, ton vecteur sera initialisé correctement (il sera vide par contre).

    Les deux codes reviennent, un peu prés, au même.

  10. #10
    Membre averti
    Inscrit en
    Décembre 2009
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 33
    Par défaut
    Citation Envoyé par Flob90 Voir le message
    Qu'entends tu par ré-instancier ?
    En fait je comprend pas quand est instancié mon objet de classe FluidParticles, dans la classe ParticleSystem.

    Pour moi, il est instancié uniquement quand je l'instancie explicitement dans le constructeur de ParticleSystem. C'est pour ça que je vois pas trop pourquoi j'aurai besoin de constructeur par défaut, vu que je veux jamais instancier cet objet "par défaut"

    Du coup, est-ce que dans mon programme, l'objet FluidParticles est instancié "2 fois" ? Une fois à un moment qui m'est inconnu, avec le constructeur par défaut, et ensuite est "écrasé" par l'objet que je construit pendant la construction de ParticleSystem?

  11. #11
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Doubs (Franche Comté)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    Quand tu rentres dans le coprs du constructeur tes attributs sont tous initialisés (sauf cas de no-initialization), ceci est fait dans la liste d'intialisation, si tu ne la mets pas explicitement elle utilise les contructeurs par défaut pour tout tes membres (et tes classes de base). Il faut donc que tu lui précises comment initialisé FluidParticles dans cette liste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ParticleSystem::ParticleSystem(void) : Particles(0,0,0,0,0)
    {}
    Je te laisse voir la FaQ pour les détails sur la syntaxe (c'est en gros là même que pour les classes de base à part que tu utilises le nom de l'attribut).

Discussions similaires

  1. comment modifier le constructeur par défaut
    Par une_tite_question dans le forum NetBeans
    Réponses: 6
    Dernier message: 18/06/2008, 21h24
  2. notion de constructeur par défaut
    Par new_wave dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 09/05/2008, 19h33
  3. Réponses: 8
    Dernier message: 27/10/2006, 14h36
  4. Réponses: 11
    Dernier message: 25/08/2006, 16h00
  5. Constructeur par défaut en cas de surcharge
    Par gigi_m dans le forum MFC
    Réponses: 4
    Dernier message: 08/06/2005, 09h58

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