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 avec paramètres et classe dérivées


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de BigNic
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 195
    Par défaut constructeur avec paramètres et classe dérivées
    J'ai une classe de base (A) dont le seul constructeur qui existe est un constructeur prenant un attribut, disont une std::string qui est son nom. J'aimerai que toutes ces classe dérivées (A1, A2, ....)facent de même. Est-ce possible de faire quelquechose dans la classe de base pour les obligés à le faire ?
    En d'autre terme j'aimerai éviter quequelqu'un fasse cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class A1: public A
    {
        A1():A("pas de nom"){};
    };
    Le constructeur par défaut de A1 existe et peut être utilisé, ce que je voulais éviter.
    En plus le constructeur de A1 prenant une std::string n'existe pas ce que je voulait éviter aussi.

  2. #2
    Membre Expert
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Par défaut
    En plus le constructeur de A1 prenant une std::string n'existe pas ce que je voulait éviter aussi.
    Tu ne peux le spécifier, une personne qui créer une class A3 pour hériter de A peut faire ce qu'elle veut dans ces constructeurs ! (je ne vois pas de méthode pour l’empêcher de faire des constructeurs)

    J'ai une classe de base (A) dont le seul constructeur qui existe est un constructeur prenant un attribut
    Tu as bien déclaré en private le constructeur de A par défaut ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    private:
    A(); // car celui ci est construit même si tu ne le déclares pas !
    public:
    A(String _toto);

  3. #3
    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
    Je pense que déclarer dans A un constructeur privé prenant en paramètre un const char* pourrait aider. Mais en partie seulement, car cela n'empêchera pas les classes dérivées d'utiliser un std::string. Mais ça devrait limiter déjà toute utilisation de chaîne littérale.

    A(); // car celui ci est construit même si tu ne le déclares pas !
    Non, pas s'il y en a un autre

  4. #4
    Membre confirmé Avatar de BigNic
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 195
    Par défaut
    merci pour vos réponses, même si c'est celles que je craignai.
    Vous avez des idées de pourquoi c'est comme ça ?
    Je veut dire pourquoi on peut imposer à une classe fille l'implémentation d'une méthode (utilisation de méthodes virtuelle pure dans la classe de base), mais que l'on ne puisse rien faire sur les constructeurs ?
    Il y certainement une raison logique, mais elle m'échappe.

  5. #5
    Membre Expert
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Par défaut
    Autant l'appel de fonctions héritées est super important, autant l'appel d'un constructeur ne l'ai pas.

    Ce qu'on souhaite avec l'héritage c'est que les fonctions puissent être appelées, le constructeur le sera aussi, mais cela à une moindre importance sur le comment.

    A(); // car celui ci est construit même si tu ne le déclares pas !
    Non, pas s'il y en a un autre
    J'avais oublié

    Je pensais qu’il faisait partie de la liste constructeur par copie/destructeur/constructeur operateur =

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Par défaut
    Oui, il y a une raison logique.
    Les methodes, opérateurs et destructeurs ce sont moultes trucs qui peuvent potentiellement être redéfinis dans une classe fille. D'où le fait que la classe mêre aie une influence la dessus (attention qu'elle ne peut "empecher" une classe fille d'avoir plus de possibilités, si ce n'est par un élément de syntaxe tordu). Le constructeur c'est différent: il faut connaitre le nom de ta classe pour l'instancier, d'où le fait qu'il soit spécifique à une classe et pas ses dérivées.
    De toutes façon, je te déconseille de vouloir absolument faire des classes sans constructeur par défaut. Ca a l'air interessant comme ca mais on se rend compte à la longue que ca devient énervant.

  7. #7
    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
    Citation Envoyé par zais_ethael
    De toutes façons, je te déconseille de vouloir absolument faire des classes sans constructeur par défaut. Ca a l'air interessant comme ca mais on se rend compte à la longue que ca devient énervant.
    J'ai tendance à partir dans l'autre direction : pas de constructeur par défaut, pas de mutateur trivial.
    Cela limite les abus du genre
    écris sur deux lignes évidemment séparées de 10 autres sans rapport.
    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...

  8. #8
    Invité
    Invité(e)
    Par défaut
    non malheureusement, tu ne peux pas empecher quelqu'un de modeler sa propre classe, elle lui appartient (meme si elle dérive de la tienne).

    ce que tu peux faire, c'est uniquement de restreindre l'acces à TA classe, donc en ne définissant qu'un seu constructeur (pourquoi pas avec un attribut "explicit"). tu peux également mettre le constructeur en protected (pas private) pour que ta classe soit abstraite et force à etre dérivée, mais la encore, tu ne pourras pas empécher l'architecte de créer un constructeur sans parametre sur la classe fille.

    une question cela dit :
    pourquoi la classe qui héritera de la tienne ne peut pas définir un constructeur saus parametre et appeler le tient en passant la bonne string ? (si c'est le comportement que la classe fille doit avoir )

  9. #9
    Membre confirmé Avatar de BigNic
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 195
    Par défaut
    Citation Envoyé par toxcct
    une question cela dit :
    pourquoi la classe qui héritera de la tienne ne peut pas définir un constructeur saus parametre et appeler le tient en passant la bonne string ? (si c'est le comportement que la classe fille doit avoir )
    C'est une bonne question ça
    Pour de mauvaise raisons je suppose. En fait dans ma classe mère j'ai mis un attribut qui doit absoluement être rempli. Mais comme son utilité n'est pas visible au premier coup d'oeil et que je sais qui va produire les classes dérivées; je sens bien que cetains architectes vont me mettre un valeur en dur comme ça dans leur code. Et avec des tests sommaires ils auront l'ipression que cela marche et puis il vont livrer mettre enb prod et quand le bug aparaitra ce sera trop tard. Il vont venir me voir en disant:"ton truc y marche pas" alors je leur ferai remarqué qu'ils on fait un truc déconseillé dans la doc. Et ils vont me dire, comme d'hab, "j'ai pas sle temps des les lires tes doc."
    Vous le dites si j'étalle un peu trop ma vie.

  10. #10
    Invité
    Invité(e)
    Par défaut
    si les docs sont écrites, tu es a l'abri. mais tu as peut etre bien aussi un probleme de design a repenser...

    cela dit, je ne visualise toujours pas le réel pb... lol

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 28/11/2014, 15h21
  2. Réflection : Appel constructeur avec tableau de classe
    Par JohnNC dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 30/12/2009, 10h46
  3. Procédure stockée avec param de sortie:marchepas av ADO
    Par Fabby69 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 14/10/2004, 12h04
  4. Réponses: 7
    Dernier message: 30/09/2004, 12h55
  5. Ouvrir fenêtre avec param
    Par Saber22 dans le forum Composants VCL
    Réponses: 2
    Dernier message: 12/05/2003, 15h48

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