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++/CLI Discussion :

Objets instanci�s dans une classem�re et fille


Sujet :

C++/CLI

  1. #1
    Membre confirm�
    Inscrit en
    F�vrier 2013
    Messages
    94
    D�tails du profil
    Informations forums :
    Inscription : F�vrier 2013
    Messages : 94
    Par d�faut Objets instanci�s dans une classem�re et fille
    Bonsoir � toutes et � tous,

    J'ai un petit probl�me d'architecture, sans doute tr�s simple � r�soudre: j'ai une classe m�re et une classe fille et chacune d'elles instancient un objet.
    Mais ces objets diff�rent suivant que ce soit la classe m�re ou la classe fille qui les instancie, exemple:

    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
    //**************** Base Class ****************
    class Base {
    public:
        Base(int a1, int a2, int a3)
        :a{a1}, b{a2}, c{a3}
        {
            L = new Autre_Base(a1, a2);
        };
        ~Base() {
            delete L;
        };
    protected:
        int a, b, c;
    private:
        Autre_Base * L;
    };
     
    //**************** Derived Class ****************
    class Derived: public Base{
    public:
        Derived(int a1, int a2, int a3)
        :Base(a1, a2, a3)
        {
            L = new Autre_Derived(a1, a3);
        };
        ~Base() {};
    private:
        Autre_derived * L;
    };
     
    //**************** Autre_Base Class ****************
    class Autre_Base {
    public:
        Autre_Base(int a1, int b1)
        :a{a1}, b{b1}
        {};
        ~Autre_Base() {};
    protected:
        int a, b;
    };
     
    //**************** Autre_Derived Class ****************
    class Autre_Derived: public Autre_Base {
    public:
        Autre_Derived(int a1, int b1)
        :Autre_Base(a1, b1)
        {};
        ~Autre_Derived() {};
    };
    Je n'ai pas d�taill� plus, mais des fonctions sont pr�sentes dans Autre_Base et Autre_derived qui effectuent des calculs similaires mais avec des diff�rences fondamentales.
    D'autre part, si j'appelle le constructeur de 'Derived' qui appelle celui de la 'Base', l'objet 'L' est instanci� 2 fois (une fois dans la Base et une fois dans la Derived)
    Comment arranger cette structure (dois-je passer par une classe pure virtuelle?). Sachant que cette structure est l�g�re mais instanci�e intensivement (de l'ordre de 10^11 ou 10^12 fois environ).

    Merci beaucoup pour vos conseils �clair�s!

  2. #2
    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
    On sent un "code smell" (lien wiki en fran�ais et anglais)

    Il me semble que pour faire ce que tu veux faire, il faut faire une fonction virtuelle, une fonction
    1. que tu appelles dans le constructeur de la classe m�re
    2. que tu mets les sp�cificit�s de chaque classe


    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
    //**************** Base Class ****************
    class Base {
    public:
        Base(int a1, int a2, int a3) : a{a1}, b{a2}, c{a3} {
            specific_init();
        }
        ~Base() {
            delete L;
        }
     
    protected:
        virtual void specific_init() {
            L = new Autre_Base(a1, a2);
        }
     
    protected:
        int a, b, c;
     
    private:
        Autre_Base * L;
    };
     
    //**************** Derived Class ****************
    class Derived: public Base{
    public:
        Derived(int a1, int a2, int a3) : Base(a1, a2, a3) {}
        ~Base() {}
     
    protected:
        virtual void specific_init() {
            L = new Autre_Derived(a1, a3);
        }
     
    private:
        Autre_derived * L;
    };

    �dit 1 : En C++, on ne peut pas appeler une fonction virtuelle dans le constructeur
    Ah fl�te
    Il faut passer par des templates pour appeler cette fonction Et m�me mieux pour passer le type de l'objet

    �dit 2 : � la place des templates, je pense qu'on peut utiliser des injections de d�pendances (<- lien wiki en anglais, mais en gros on passe l'objet soit au constructeur soit � l'appel du traitement)
    Et au vu de mon code, peut-�tre que l'h�ritage n'est plus n�cessaire

    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
    typedef Autre_Base* (*t_specific_init) (int, int, int); // maybe useless parameters
     
    //**************** Base Class ****************
    template <typename T, t_specific_init specific_init>
    class Base {
    public:
        Base(int a1, int a2, int a3) : a{a1}, b{a2}, c{a3} {
            L = specific_init(a1, a2, a3);
        }
        ~Base() {
            delete L;
        }
     
    protected:
        int a, b, c;
     
    private:
        T* L;
    };
     
    //**************** Derived Class ****************
    template <typename T, t_specific_init specific_init>
    class Derived: public Base<T, specific_init> {
    public:
        Derived(int a1, int a2, int a3) : Base(a1, a2, a3) {}
        ~Base() {}
    };

  3. #3
    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
    Bonjour,

    A mon avis le probl�me doit pouvoir �tre r�solu avec un design pattern plus adapt�e.

    Le premier qui me vient en t�te, c'est une Factory: https://en.wikipedia.org/wiki/Factory_method_pattern
    Tu as un ensemble d'objets manipul�s de la m�me mani�re mais de types diff�rents.

    En r�gle g�n�ral, si dans ton code tu as multiplies les "if" et les cast dans une m�thode ou une classe, c'est que tu as plusieurs m�thodes/objets disctincts.

    ++.

Discussions similaires

  1. R�ponses: 2
    Dernier message: 14/04/2017, 22h09
  2. Acc�der � un objet instanci� dans une autre classe
    Par valentin358 dans le forum Langage
    R�ponses: 4
    Dernier message: 05/12/2011, 23h31
  3. [POO] Tableau d'objets B dans une instance de class A
    Par Invit� dans le forum Langage
    R�ponses: 4
    Dernier message: 24/05/2006, 09h52
  4. Transmission d'un objet cr�e dans une fonction
    Par EvilAngel dans le forum ASP
    R�ponses: 2
    Dernier message: 10/05/2004, 20h19
  5. [Vb.net] Index� un objet cr�e dans une boucle
    Par picpic dans le forum Windows Forms
    R�ponses: 10
    Dernier message: 17/12/2003, 14h37

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