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

Langage C++ Discussion :

Instancier une classe donnée dans une autre classe


Sujet :

Langage C++

  1. #1
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut Instancier une classe donnée dans une autre classe
    Bonjour à toutes et à tous,

    J'ai une problème d'instanciation. Je dispose d'une classe de base A et de deux classes enfants de A : B et C.
    Je crée enfin une classe D enfant de B et dans laquelle je souhaite avoir une instance de C. C'est là que je n'y arrive pas :

    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
    class A {
      A();
    };
     
    class B : public A {
      B(int);
    };
     
    class C : public A {
      C(int, int);
    };
     
    class D : public B {
      D(int, int, int);
      C c(int,int); // une instance de C ???
    };
     
    D::D(int a, int b, int c) : B(int) {
    // je suppose que c'est ici que je dois instancier C, mais après avoir essayé divers trucs, je m'aperçois que je ne sais pas faire
    }

    Jusque là, ça colle. Mais apparemment, si la dernière ligne de la classe D déclare une classe C en son sein, pour autant, cette déclaration ne constitue pas une instanciation de cette classe. Comment faire pour qu'il y ait instanciation ?

    Merci de votre aide.

    Pierre

  2. #2
    Membre averti
    Homme Profil pro
    Analyse système
    Inscrit en
    Novembre 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 227
    Points : 311
    Points
    311
    Par défaut
    Bonsoir,
    L'instanciation de C se fera dans le constructeur de la classe D.
    Cependant comme dans ta classe C, il n'y a pas de constructeur par défaut, il te faut déclarer un pointeur sur la classe C dans la classe D.

    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
    class A {
    public :
      A();
    };
     
    class B : public A {
    public:    // Le constructeur doit être public
      B(int);
    };
     
    class C : public A {
    public : 
      C(int, int);
    };
     
    class D : public B {
    public :
      D(int, int, int);
    private :   // Afin de respecter le principe d'encapsulation des données (notion de langage objet) il est préférable de déclarer les membres de ta classe en private ou protected.
      C* c; // L'absence de constructeur sans argument t'oblige à utiliser un pointeur
    };
     
    D::D(int a, int b, int c) : B(b) {
      c = new C(a,c);
    }
    Attention il te faut penser à mettre le mot clé avant de déclarer tes constructeurs, sinon ceux-ci seront privés.

    La différence entre private et protected tiens dans le fait que lors de l'héritage, tous ce qui est private (sauf dans le cas d'un héritage private) n'est pas accessible par la classe fille alors que tous ce qui est protected est accessible dans la classe fille.

    J'espère être assez clair. Sinon n'hésite pas le dire.

  3. #3
    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 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Bonsoir,

    Si tu veux créer un C, pourquoi écrire un prototype de méthode qui retourne un C ?
    Tu ignores la syntaxe d'ajout d'un membre à une classe ?

    // L'absence de constructeur sans argument t'oblige à utiliser un pointeur
    Faux. Il suffit d'utiliser la liste d'initialisation !
    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.

  4. #4
    Membre averti
    Homme Profil pro
    Analyse système
    Inscrit en
    Novembre 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 227
    Points : 311
    Points
    311
    Par défaut
    Citation:
    // L'absence de constructeur sans argument t'oblige à utiliser un pointeur
    Faux. Il suffit d'utiliser la liste d'initialisation !
    Peux-tu illustrer ton propos à l'aide d'un exemple s'il te plait.

  5. #5
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    @ A.F_2.8 : si je fais ce que tu me dis, j'obtiens l'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sketch_sep17a.ino: In constructor 'D::D(int, int, int)':
    sketch_sep17a:24: error: invalid conversion from 'C*' to 'int'
    sur la ligne :

    J'avoue ne pas comprendre !

    @ Bousk :tu dis : Si tu veux créer un C, pourquoi écrire un prototype de méthode qui retourne un C ? Parce que ce prototype (la classe D si j'ai bien compris ce que tu veux dire) fait aussi autre chose.

    tu dis aussi : Tu ignores la syntaxe d'ajout d'un membre à une classe ? Ben ... apparemment oui !

    et encore : Faux. Il suffit d'utiliser la liste d'initialisation ! Je n'ai pas réussi à comprendre en quoi cela consistait. Beaucoup de liens indiquent que c'est nécessaire mais je n'en ai pas trouvé qui explique clairement ce que c'est.

    Merci de votre aide.

    Pierre

  6. #6
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Au passage, je vous explique ce que je fais.

    Ma classe A est la classe de base de composants visuels.

    La classe B en dérive, c'est un Bouton

    La classe C en dérive aussi, c'est une fenêtre d'édition

    La classe D est un clavier. Comme c'est un ensemble de boutons, il est normal que cette classe dérive de la classe Bouton. Mais au dessus des touches du clavier, je veux afficher une fenêtre dans laquelle vont apparaître les codes des touches appuyées. Cet afficheur est un composant de la classe C. La classe D utilise donc un composant de la classe C.

    Cordialement.

    Pierre

  7. #7
    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
    Citation Envoyé par AF_2.8 Voir le message
    Peux-tu illustrer ton propos à l'aide d'un exemple s'il te plait.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class D: public B {
    public:
      D(int, int, int);
    private:
      C c;
    };
     
    D::D(int a, int b, int c):
      B(b), c(a, c)
    {
     
    }

  8. #8
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Merci Iradrille pour cet exemple fonctionnel.

    Donc, si je comprends bien, la liste d'initialisation est ce qui est après les ":" du constructeur. Cela comprend l'initialisation du parent et des classes utilisées.

    Oui, non ?

    Cordialement.

    Pierre

  9. #9
    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
    Citation Envoyé par ChPr Voir le message
    Merci Iradrille pour cet exemple fonctionnel.

    Donc, si je comprends bien, la liste d'initialisation est ce qui est après les ":" du constructeur.
    Exactement.

    Tu peux initialiser tous les membres comme ça et il est d'ailleurs recommandé de passer par ça plutôt que d'initialiser dans le corps du ctor.

  10. #10
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,
    Citation Envoyé par ChPr Voir le message
    Merci Iradrille pour cet exemple fonctionnel.

    Donc, si je comprends bien, la liste d'initialisation est ce qui est après les ":" du constructeur.
    Exactement
    Cela comprend l'initialisation du parent et des classes utilisées.

    Oui, non ?

    Cordialement.

    Pierre
    Cela va plus loin : cela reprend le constructeur des classes parents (comme tu l'as dit) et de tous les membres de la classe, quel que soit leur type, que ce soit des valeurs, des pointeurs ou des référence, que ce soit des classes, des énumération ou des types primitifs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class Base{
        public:
            Base( int i);
    };
    class C{
        /* ... */
    };
    class Derivee : public Base{
        Derivee(int i, double j, C & c):Base(i),tab_(new int[10]), j_(j), c_(c){}
        private:
           int *tab_;
           double j_;
           C & c_;
    }
    est un code tout à fait légal

    (pour information, pour les types primitifs et assimilés, il existe un "pseudo constructeur" qui permet de les initialiser exactement comme si tu initialisais une classe "normale" )
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  11. #11
    Membre averti
    Homme Profil pro
    Analyse système
    Inscrit en
    Novembre 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 227
    Points : 311
    Points
    311
    Par défaut
    Citation Envoyé par ChPr Voir le message
    Au passage, je vous explique ce que je fais.

    Ma classe A est la classe de base de composants visuels.

    La classe B en dérive, c'est un Bouton

    La classe C en dérive aussi, c'est une fenêtre d'édition

    La classe D est un clavier. Comme c'est un ensemble de boutons, il est normal que cette classe dérive de la classe Bouton. Mais au dessus des touches du clavier, je veux afficher une fenêtre dans laquelle vont apparaître les codes des touches appuyées. Cet afficheur est un composant de la classe C. La classe D utilise donc un composant de la classe C.

    Cordialement.

    Pierre
    Vue ce que tu décris, je n'aurais pas implémenté ma classse D de la sorte.
    D est un clavier, un clavier n'est pas un bouton, un clavier est composé de boutons, il ne doit donc pas hérité de Bouton, mais avoir un tableau de boutons dans ses membres.
    Car en faisant D un fils de B, il ne sera affiché qu'un seul bouton.

  12. #12
    Membre averti
    Homme Profil pro
    Analyse système
    Inscrit en
    Novembre 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 227
    Points : 311
    Points
    311
    Par défaut
    Citation Envoyé par ChPr Voir le message
    @ A.F_2.8 : si je fais ce que tu me dis, j'obtiens l'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sketch_sep17a.ino: In constructor 'D::D(int, int, int)':
    sketch_sep17a:24: error: invalid conversion from 'C*' to 'int'
    sur la ligne :

    J'avoue ne pas comprendre !
    Pierre
    C'est de ma faute, j'ai été un peu vite, dans le prototype, un des entier s'appelle c, il masque donc le membre c, il faut toujours faire attention à ce que les paramètres d'une fonction ne porte pas le même nom que des membres de la classe car sinon ils masquent les membres de la classe.
    L'idéal est de compiler avec tous les warnings, car le compilateur signalera ce problème

  13. #13
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Citation Envoyé par AF_2.8 Voir le message
    ... L'idéal est de compiler avec tous les warnings, car le compilateur signalera ce problème
    Je ne pense pas que l'éditeur d'Arduino propose cette option, mais je vais m'en assurer.

    Cordialement.

    Pierre

  14. #14
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Citation Envoyé par AF_2.8 Voir le message
    Vue ce que tu décris, je n'aurais pas implémenté ma classse D de la sorte.
    D est un clavier, un clavier n'est pas un bouton, un clavier est composé de boutons, il ne doit donc pas hériter de Bouton, mais avoir un tableau de boutons dans ses membres.
    Car en faisant D un fils de B, il ne sera affiché qu'un seul bouton.
    Je suis d'accord avec toi, c'est ce à quoi j'avais pensé en premier. mais voilà, la mémoire vive disponible sur les cartes Arduino Mega2560 n'est que de 8 ko, c'est donc une denrée rare et chère.

    Or, je souhaite avoir 32 touches. Chaque bouton me consommant 34 octets, et l'éditeur de texte 38, le clavier aurait consommé 34 x 32 + 38 = 1126 octets + les variables propres à ce composant, j'aurais atteint de l'ordre de 1200 octets.

    En dérivant la classe "Clavier" de la classe "Bouton", je bénéficie des fonctionnalités de "Bouton" (procédure de dessin, ...) et compte tenu des diverses variables propre à "Clavier", j'en arrive à moins de 200 octets au total dans cette configuration. Je gagne donc 1 ko , ce qui est pas mal pour une disponibilité de 8 ko.

    Cordialement.

    Pierre

  15. #15
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    En fait, ton "clavier" n'est pas tant un "bouton" mais un "contrôle"?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  16. #16
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    En fait, ton "clavier" n'est pas tant un "bouton" mais un "contrôle"?
    Je n'ai jamais dit que c'était un bouton, j'ai seulement dit que cette classe dérivait de la classe Bouton.

    Cordialement.

    Pierre

  17. #17
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par ChPr Voir le message
    Je n'ai jamais dit que c'était un bouton, j'ai seulement dit que cette classe dérivait de la classe Bouton.
    Tu n'as donc jamais dit que cette classe était un bouton, mais, dans les faits, c'en est bel et bien un :

    L'héritage publique est une relation EST-UN, dans toute la sémantique du terme, tout comme une classe voiture peut hériter d'une classe véhicule parce qu'une voiture EST effectivement UN véhicule
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  18. #18
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    D'un autre côté, si tu veux bénéficier de fonctions de Bouton sans en être un, l'héritage privé peut être une option.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  19. #19
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Bonjour

    Je reviens sur ce problème de création d'une instance dans une autre instance. Iradrille a donné la solution suivante qui est tout à fait fonctionnelle :

    Citation Envoyé par Iradrille Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class D: public B {
    public:
      D(int, int, int);
    private:
      C c;
    };
     
    D::D(int a, int b, int c):
      B(b), c(a, c)
    {
     
    }
    Je complique un peu le problème en ce sens où je souhaite que l'instanciation de C dans D soit conditionnelle. Autrement dit, lorsque j'instancie D, je ne souhaite pas toujours y inclure une classe C.

    Apparemment, on ne peut pas mettre de code dans la liste d'initialisation. Avez-vous une idée de comment faire ?

    Merci de votre aide.

    Pierre

  20. #20
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Un unique_ptr<C> dans la classe D, avec un opérateur ternaire dans son initialisation...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. Recherche des données dans une BD ou dans une List
    Par mesken dans le forum Hibernate
    Réponses: 3
    Dernier message: 15/05/2011, 16h45
  2. Réponses: 8
    Dernier message: 05/04/2011, 08h06
  3. [XL-2003] Récupération des données dans une base à partir d'une valeur donnée
    Par mandrake57 dans le forum Macros et VBA Excel
    Réponses: 19
    Dernier message: 01/04/2011, 14h33
  4. Réponses: 9
    Dernier message: 10/02/2010, 18h30
  5. Réponses: 7
    Dernier message: 03/12/2008, 15h18

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