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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé 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
    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/

  2. #2
    Membre Expert
    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 : 38
    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
    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.).

  3. #3
    Membre éclairé 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
    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 !

  4. #4
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 772
    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 772
    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
    760
    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 : 760
    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 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
    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 éclairé 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
    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,

  8. #8
    Membre Expert
    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 : 38
    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
    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 ?

+ 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