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 :

Promotion d'objet et attribut manquant


Sujet :

C++

  1. #1
    Membre averti Avatar de Seabirds
    Homme Profil pro
    Post-doctoral fellow
    Inscrit en
    Avril 2015
    Messages
    294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Post-doctoral fellow
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2015
    Messages : 294
    Points : 341
    Points
    341
    Par défaut Promotion d'objet et attribut manquant
    Bonjour et toutes et à tous,

    J'ai pas mal cherché de droite et de gauche, mais je ne suis pas parvenu à trouver de réponse exacte à mon problème (sans aucun doute extrêmement classique) :

    Je fabrique des objets à un moment donné, auxquels manquent certaines spécificités qui sont encore inconnues au moment de la construction de l'objet. D'après ce qu'il me semble avoir compris, ce serait une mauvaise idée de construire un objet "global" avec des attributs vides pour les remplir petit à petit. D'où mon idée de faire une chaîne d'héritage de l'objet le moins complet A (ancêtre) vers le plus complet B (dérivé), et de les promouvoir au bon moment quand l'attribut est calculable.
    Le truc que je ne sais pas, c'est le où/quand/comment dire en C++ "prend l'objet A, transforme le en B en ajoutant cet attribut_là qui manquait".
    C'est vrai que ça paraît élémentaire, mais je ne parviens vraiment pas à faire les bonnes requêtes. Pourriez-vous au moins me donner des mots clés, que je puisse préciser mes recherches internet ? J'ai l'impression que ça ressemble à du clonage amélioré...

    Merci d'avance !
    Bien cordialement,

    [Edit]
    Je suis tombé sur ce sujet qui à l'air de ressembler à ce que je veux... sauf que c'est en python et que j'y comprends rien :/ http://www.developpez.net/forums/d71...bjets-parents/
    Le débutant, lui, ignore qu'il ignore à ce point, il est fier de ses premiers succès, bien plus qu'il n'est conscient de l'étendue de ce qu'il ne sait pas, dès qu'il progresse en revanche, dès que s'accroît ce qu'il sait, il commence à saisir tout ce qui manque encore à son savoir. Qui sait peu ignore aussi très peu. [Roger Pol-Droit]
    Github
    Mon tout premier projet: une bibliothèque de simulation de génétique des populations

  2. #2
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut
    Aussi simplement que cela :
    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
    class Coords2D
    {
        double _x;
        double _y;
    public:
        Coords2D(double x, double y) : _x(x), _y(y) {}
    };
     
    class Coords3D : public Coords2D
    {
        double _z;
    public:
        Coords3D(Coords2D const& base) : _x(base.x), _y(base.y) {}
        Coords3D(Coords2D const& base, double z) : _x(base.x), _y(base.y), _z(z) {}
    };
    J'ai éliminé de cet exemple tout élément normalement indispensable mais qui n'illustre pas mon propos. Pense à définir tes classes proprement (tous les constructeurs, destructeurs virtuel si besoin, assignation, etc.).
    -- Yankel Scialom

  3. #3
    Membre averti Avatar de Seabirds
    Homme Profil pro
    Post-doctoral fellow
    Inscrit en
    Avril 2015
    Messages
    294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Post-doctoral fellow
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2015
    Messages : 294
    Points : 341
    Points
    341
    Par défaut
    Merci de ta réponse !

    En fait, on ne rajoute pas un attribut à un objet déjà existant, on en reconstruit littéralement un de novo, en allant piquer les attributs dans l'objet de la classe parent. C'est bien ça ?

    Si oui, cela me parait un peu bizarre sur le plan conceptuel, parce que ça nous oblige à connaître exactement la composition de l'objet parent (alors qu'on s'en fiche un chouïa), et à écrire des choses qu'on ne devrait pas forcément écrire (on veut pas toucher aux attributs déjà définis, on veut juste en rajouter un).
    De plus ça me semble (naïvement) couteux de reconstruire un objet "from scratch" (avec possiblement pleins d'attributs) plutôt que de juste ajouter une seule info. Parce qu'il faut dire que je compte faire cette opération sur un parcours d'arbre, avec plusieurs centaines de feuilles, parcours répété quelques dizaines de millions de fois... La POO ne propose aucun moyen de faire autrement ?

    Merci de ta réponse en tout cas, je vais déjà appliquer ça dans un premier temps !
    Le débutant, lui, ignore qu'il ignore à ce point, il est fier de ses premiers succès, bien plus qu'il n'est conscient de l'étendue de ce qu'il ne sait pas, dès qu'il progresse en revanche, dès que s'accroît ce qu'il sait, il commence à saisir tout ce qui manque encore à son savoir. Qui sait peu ignore aussi très peu. [Roger Pol-Droit]
    Github
    Mon tout premier projet: une bibliothèque de simulation de génétique des populations

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 629
    Points : 10 554
    Points
    10 554
    Par défaut
    Alors essaye de regarder du côté des traits ou des class Policy en C++

    Désolé , mais je n'arrive jamais à retenir les différences entre les 2: c'est pour cela que je n'ai pas d'explication.

    Sinon, un héritage de 1 ou 2 n'est pas pénalisant .
    Moi avec la VCL (C++ Builder) je me mange des héritages de 7 à 10 de profondeur (*) et cela passe [en apparence et avec 2-3 tests] crème.

    *: TObject -> TPersistent -> TComponent > TControl -> TTwinControl -> TScrollingWindow -> TCustomForm -> TForm, TForm une fenêtre de base toute bête

  5. #5
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 739
    Points : 3 627
    Points
    3 627
    Par défaut
    Si toutes les feuilles sont du même type (comprendre, vont au final avoir les mêmes attributs), l'héritage est une mauvaise idée. On préfère effectivement initialiser tous les attributs d'une classe dans le constructeur, mais il n'y a rien de gênant à ne pas le faire. Par contre, il faut que la fin du processus de création retourne des objets valides.

    Si les étapes de construction initialisent des attributs différents, tu peux les séparer en plusieurs classes et les regrouper en tant que ’attribut dans le type de la feuille (ou faire des proxy). Ainsi, il est plus facile d'initialiser juste les attributs concernés par une fonction d'initialisation/de construction.

  6. #6
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 963
    Points
    32 963
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par Seabirds Voir le message
    En fait, on ne rajoute pas un attribut à un objet déjà existant, on en reconstruit littéralement un de novo, en allant piquer les attributs dans l'objet de la classe parent. C'est bien ça ?

    Si oui, cela me parait un peu bizarre sur le plan conceptuel, parce que ça nous oblige à connaître exactement la composition de l'objet parent (alors qu'on s'en fiche un chouïa), et à écrire des choses qu'on ne devrait pas forcément écrire (on veut pas toucher aux attributs déjà définis, on veut juste en rajouter un).
    Le truc c'est que tu dis vouloir le faire en C++, et t'as pas le choix.
    C'est un langage fortement typé, tu peux pas te permettre de faire n'importe quoi comme en python, comme ajouter des attributs/méthodes à une classe à la volée. Et c'est pas un mal.
    De là, plusieurs solutions
    - tu fais du Python
    - tu adaptes ta solution au C++, et si ça te semble pas bon, c'est plus certainement ta solution qui n'est pas bonne que le langage

    De plus ça me semble (naïvement) couteux de reconstruire un objet "from scratch" (avec possiblement pleins d'attributs) plutôt que de juste ajouter une seule info. Parce qu'il faut dire que je compte faire cette opération sur un parcours d'arbre, avec plusieurs centaines de feuilles, parcours répété quelques dizaines de millions de fois... La POO ne propose aucun moyen de faire autrement ?
    Un objet qui stocke 3 int n'aura rien de couteux..
    Une centaine de feuilles c'est ridiculement bas. Mais "quelques dizaines de millions" de parcours, ça me parait au contraire très exagéré et/ou une mauvaise idée. En tous cas ce chiffre balancé comme ça n'a pas grand sens.

    Et si tu veux juste initialiser un certain type, ajouter un attribut int à une classe, on a inventé la map.
    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.

  7. #7
    Membre averti Avatar de Seabirds
    Homme Profil pro
    Post-doctoral fellow
    Inscrit en
    Avril 2015
    Messages
    294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Post-doctoral fellow
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2015
    Messages : 294
    Points : 341
    Points
    341
    Par défaut
    Merci à tous pour vos réponses, je vais potasser tout ça !

    Mais "quelques dizaines de millions" de parcours, ça me parait au contraire très exagéré et/ou une mauvaise idée. En tous cas ce chiffre balancé comme ça n'a pas grand sens.
    Et pourtant ce n'est pas exagéré, c'est une méthode statistique classique pour l'estimation de paramètres d'un modèle probabiliste, méthode qui consiste à faire des simulations massives (de l'ordre de plusieurs millions) lorsque toutes les autres méthodes inférentielles sont inopérantes. Pour ceux que ça intéresse, elle porte le doux nom de "Approximate Bayesian Computation". Et mon modèle nécessite la construction et le parcours de plusieurs dizaines d'arbres à chaque simulation, d'où le chiffre de plusieurs dizaines de millions avancé plus tôt Je voulais vous épargner cette explication

    En tout cas merci encore à vous tous, je vous tiens au jus dès que j'ai réussi à pondre un truc potable !
    Bien cordialement,
    Le débutant, lui, ignore qu'il ignore à ce point, il est fier de ses premiers succès, bien plus qu'il n'est conscient de l'étendue de ce qu'il ne sait pas, dès qu'il progresse en revanche, dès que s'accroît ce qu'il sait, il commence à saisir tout ce qui manque encore à son savoir. Qui sait peu ignore aussi très peu. [Roger Pol-Droit]
    Github
    Mon tout premier projet: une bibliothèque de simulation de génétique des populations

  8. #8
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut
    En gros, ce que tu souhaiterais c'est du Decorator Pattern mais avec des données plutôt que des comportement ? Je suis certain que c'est faisable. Ensuite, est-ce la meilleure solution ?
    -- Yankel Scialom

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 068
    Points : 12 111
    Points
    12 111
    Par défaut
    Des Design Pattern de création d'objet, il y a en pas mal, https://en.wikipedia.org/wiki/Creational_pattern.

  10. #10
    Membre expérimenté

    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 685
    Points : 1 418
    Points
    1 418
    Par défaut
    En fait je penses que le problème est d'essayer de conceptualiser cela avec l'héritage, plutôt qu'avec des compositions. Peut-être qu'avec un conteneur d'une classe "Propriete" ? Ensuite a toi de spécialiser cette classe selon tes besoins ? En terme de service, cela me parait plus difficile à concevoir, mais ça ouvrirai plus de flexibilité...

    Ce que tu veux, Python, Js, ou encore C# le permettent, en C++, étendre une classe à la volée n'est pas possible, à ma connaissance.

    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
     
    class Parameter
    {
     
    }
     
    class CoordParameter ; public Parameter
    {
        double dim;
     
       public : 
            Coord(double d);
    }
     
    <typename Label>
    class Parametrable
    {
       std:map<Label, Parameter> proprietes;
    }
     
    class Coords : public Parametrable<string>
    {
    public:
        addCoord(string axe, double d) 
        {
             proprietes[axe] = new Coord(d);
        }
    };
    Bon c'est un brouillon qui ne compilera pas du tout et qui nécessite d'être améliorer mais c'est juste pour donner une idée
    Nullius in verba

  11. #11
    Expert confirmé
    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
    Points : 4 442
    Points
    4 442
    Par défaut
    A noter quand même que les différents types en jeu n'ont pas forcément de lien (et donc pas forcément besoin d'héritage). En JS / Python / autres c'est possible de rajouter un attribut à un objet (mais on change son type)
    Code js : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var obj = {
       x: 42,
       y: 12
    };
     
    obj["z"] = 45; // on ajoute un "membre" z

    En C++ c'est pas possible, mais il y à plusieurs approches:
    Dans certains cas une std::map fait le boulot (en considérant les couples clefs / valeurs comme des attributs d'un objet -> c'est probablement le plus proche du fonctionnement du JS, mais niveau perf c'est pas la joie en C++).
    Sinon comme @prgasp77 et les autres le disent, tu peux créer un nouvel objet avec le type correct (mais pas forcément besoin d'héritage; Coords3D qui hérite de Coords2D me semble être une hérésie par exemple).
    Tu peux aussi utiliser un seul objet avec un membre non initialisé (mais généralement ça viole le principe qui dit qu'un objet est dans un état valide après que le ctor ait fait son boulot).

  12. #12
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut
    Citation Envoyé par Iradrille Voir le message
    Sinon comme @prgasp77 et les autres le disent, tu peux créer un nouvel objet avec le type correct (mais pas forcément besoin d'héritage; Coords3D qui hérite de Coords2D me semble être une hérésie par exemple).
    Oui , c'est même plus qu'une hérésie, c'est un exemple de ce qu'il ne faut pas faire à mon sens.

    Citation Envoyé par Iradrille Voir le message
    Tu peux aussi utiliser un seul objet avec un membre non initialisé (mais généralement ça viole le principe qui dit qu'un objet est dans un état valide après que le ctor ait fait son boulot).
    Une monade Maybe est, à mon sens, la meilleure solution.
    -- Yankel Scialom

  13. #13
    Membre averti Avatar de Seabirds
    Homme Profil pro
    Post-doctoral fellow
    Inscrit en
    Avril 2015
    Messages
    294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Post-doctoral fellow
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2015
    Messages : 294
    Points : 341
    Points
    341
    Par défaut
    Ok c'est noté pour toutes les solutions que vous envisagez, et je vous remercie de l'avalanche d'informations que vous m'offrez. Je suis en train de faire le tour des docs

    L'idée de l'héritage, c'était de pouvoir conditionner certains traitements sur un arbre en fonction du type des données encapsulées dans chaque node. En effet les états des données peuvent tout à fait être valides pour certains traitements mais invalides pour d'autres, et je ne souhaitais pas devoir tester à chaque fois si l'attribut existe ou n'existe pas... J'avais cru comprendre que quand on passe son temps à tester l'existence d'un attribut c'est qu'on avait loupé un héritage (mais j'ai certainement over-simplifié les message ^^")...
    Donc dans un premier temps je vais rester sur l'option de laisser l'attribut non-défini et le définir au moment opportun comme le disait Iradrille, (et sans doute m'essayer à la monade Maybe comme proposé par prgasp77)
    Si cette première solution me pose des soucis conséquents en terme d'héritage, je reconstruirai intégralement l'objet dans une autre classe comme proposé par prgasp77.
    Et si cette deuxième solution s'avère limitante au niveau du temps de calcul, alors je m'intéresserai aux autres solutions proposées qui ont l'air fort intéressantes (traits, policy ...)

    Merci encore pour votre concours,
    Seabirds
    Le débutant, lui, ignore qu'il ignore à ce point, il est fier de ses premiers succès, bien plus qu'il n'est conscient de l'étendue de ce qu'il ne sait pas, dès qu'il progresse en revanche, dès que s'accroît ce qu'il sait, il commence à saisir tout ce qui manque encore à son savoir. Qui sait peu ignore aussi très peu. [Roger Pol-Droit]
    Github
    Mon tout premier projet: une bibliothèque de simulation de génétique des populations

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

Discussions similaires

  1. Un objet en attribut?
    Par Stéphane Bruckert dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 13/10/2008, 15h52
  2. Réponses: 10
    Dernier message: 22/09/2008, 10h23
  3. Une Liste d'objets comme attribut d'objet
    Par koomkoom dans le forum Langage
    Réponses: 1
    Dernier message: 31/08/2008, 19h20
  4. [Débutant] Objet ou Attribut qui disparait
    Par Clark dans le forum C++
    Réponses: 16
    Dernier message: 22/05/2006, 16h24
  5. [POO] Objet en attribut d'un objet
    Par Tchinkatchuk dans le forum Langage
    Réponses: 7
    Dernier message: 06/12/2005, 10h00

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