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 :

[Debutant] Une classe abstraite en parametre ?


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 115
    Points : 42
    Points
    42
    Par défaut [Debutant] Une classe abstraite en parametre ?
    Bonjour à tous,
    Voila, j'ai une nouvelle question sur quelque chose que je viens de lire, et je dois dire que cela me surprend. D'apres ce que je viens de lire, on ne peut pas se servir d'une classe abstraite comme type de retour et comme type de parametre.
    Cela est il vrai?
    Si oui, comme fait-on pour avoir le même comportement polymorphique que Java avec les interfaces ?

    Je vous remercie d'avance
    ps : dslé mais je n'ai pas pu tester avant d'écrire. Je ne pourrai que demain

  2. #2
    jmv
    jmv est déconnecté
    Membre confirmé Avatar de jmv
    Profil pro
    Enseignant
    Inscrit en
    Mai 2004
    Messages
    395
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2004
    Messages : 395
    Points : 603
    Points
    603
    Par défaut
    Il faut utiliser les pointeurs

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class A
    {
     public:
        virtual void f() = 0;
    };
     
    A* uneFonction(A* arg);
    ps : dslé mais je n'ai pas pu tester avant de répondre. Je ne pourrai que demain moi aussi

  3. #3
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    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 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Une classe abstraite ne peut pas se manipuler par valeur. La sémantique de référence est généralement la seule chose à laquelle on a le droit avec des hiérarchies d'objets. Avec les classes abstaites, on n'a alors plus le choix.

    Concernant le passage de paramètres, il faut les recevoir par adresse. Soit en recevant une adresse (par valeur -> un pointeur ; ou enveloppée dans un quelconque smart-pointer), soit en recevant une référence (constante ou non).

    Pour le retour. Si l'objet va continuer à vivre à la sortie de la fonction (comme un attribut membre), on peut retourner une référence sur l'objet. Sinon, il faut retourner un objet fraichement alloué, sous forme de pointeur (intelligent ou non).

    Bref. On peut, mais pas par valeur!

    (Java ne permet pas la sémantique de valeur que le C++ permet avec les objets. En utilisant la sémantique de référence, on en revient à ce qui ce passe avec Java.)
    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...

  4. #4
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 670
    Points
    10 670
    Billets dans le blog
    3
    Par défaut
    Pointeur ou référence. Le polymorphisme en C++ nécessite l'emploi de pointeurs / références, sinon c'est une sémantique par valeur => recopie.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 115
    Points : 42
    Points
    42
    Par défaut
    Ok je comprend mieux
    Merci beaucoup, demain je mettrai tout ceci en pratique afin de mieux percevoir les particularités.

    Mon problème est que j'ai appri l'objet avec un language ou on ne manipule que des references. Du coup tout est transparent. Mais là il s'agira juste de faire attention à ce que je fais

    Merci en tout cas, et bravo pour votre réactivité impréssionnante et agréable

    En vous remerciant
    Kiroukou

  6. #6
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 670
    Points
    10 670
    Billets dans le blog
    3
    Par défaut
    Tu peux un peu comparer les références Java à des pointeurs intelligents style boost::shared_ptr en C++ (pointeurs intelligents avec comptage de référence).
    Un autre point c'est que classe abstraite "simple" n'est pas vraiment l'équivalent des interfaces Java, ou plutot c'est imcomplet. Les interfaces Java sont simulées en C++ via des ABC (Abstract Base Class) qui sont des classes abstraites avec que des fonctions membres virtuelles pures. Ne pas oublier de rendre le destructeur virtuel dans les classe abstraites
    http://c.developpez.com/faq/cpp/?pag...UCTEUR_virtuel

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 115
    Points : 42
    Points
    42
    Par défaut
    Merci aurelien pour ce conseil.

    Mais cela m'amène à te poser une autre question

    Je n'ai trouvé qu'un seul lien expliquant boost::shared_ptr sur un exemple avec std::auto_ptr ( dont tu es le co-auteur ).

    Peux tu m'expliquer la différence entre ces 2 types de pointeurs (boost::shared_ptr et std::auto_ptr donc)? Leurs utilisation est-elle portable?

    Et encore, pourquoi est il deconseillé de l'utiliser avec les tableaux ?

    Je débute en C++ mais j'aimerai prendre directement les bonnes habitudes, ce qui explique ce harcellement de questions

    Bien à vous
    Kiroukou

  8. #8
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 670
    Points
    10 670
    Billets dans le blog
    3
    Par défaut
    C'est pas déconseillé de l'utiliser avec des tableaux, c'est interdit. C'est à cause de la différence entre delete et delete []
    http://c.developpez.com/faq/cpp/?pag...EURS_new_array
    Le danger de auto_ptr est expliqué ici:
    http://c.developpez.com/faq/cpp/?pag...NTEURS_autoptr
    l'avantage de auto_ptr est d'être standard. Après y'a plein de classe smart ptr non standard. Le quasi standard c'est boost:
    http://www.boost.org/
    un gros complément "de référence" (mais non standard) au C++
    On y trouve des smart ptr biensûr:
    http://www.boost.org/libs/smart_ptr/smart_ptr.htm
    notamment shared_ptr et shared_array (pour les tableaux).
    Ces 2 là fonctionnent par comptage de référence.
    Une autre lib réputée c'est Loki.
    Un article de référence pour tout comprendre des smart ptr, par Andrei Alexandrescu:
    http://www.informit.com/articles/article.asp?p=31529
    Bon c'est un peu long mais très intéressant. Si tu est pressé, le plus important:
    http://www.informit.com/articles/article.asp?p=31529&seqNum=5
    shared_ptr est du type Reference Counting.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 115
    Points : 42
    Points
    42
    Par défaut
    Vraiment merci Aurélien (et aux autres bien sur)
    Je vais lire un maximum de ce que tu m'as donné.
    Merci pour le temps que vous m'avez accordé.
    A bientot (ca c'est sur )
    Bien à vous
    Kiroukou

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

Discussions similaires

  1. "Instancier" une classe abstraite
    Par alex6891 dans le forum Langage
    Réponses: 5
    Dernier message: 03/05/2006, 10h56
  2. [Débutant]Passer une classe abstraite en paramètre
    Par Invité dans le forum Débuter
    Réponses: 2
    Dernier message: 06/01/2006, 17h56
  3. [MFC][Debutant] Une classe perso de CEdit
    Par kiroukou dans le forum MFC
    Réponses: 6
    Dernier message: 21/06/2005, 15h07
  4. Réponses: 2
    Dernier message: 27/03/2005, 16h09
  5. [Debutant][Conception] Classes abstraites et interface.
    Par SirDarken dans le forum Langage
    Réponses: 4
    Dernier message: 29/10/2004, 00h02

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