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 :

Equivalent C++


Sujet :

C++

  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 177
    Points : 196
    Points
    196
    Par défaut Equivalent C++
    Bonjours je cherche l'equivalent C++
    des interfaces Java ou
    des methode virtuel qui sont overridé.

    En gros j'aimerais faire un type qui ne contient qu'une serie de fonction sans leur implémentation (probablement une virtuel pure)

    et dans une fonction, appelé la méthode de ce qu'est réelement l'objet.
    Je connais l'existance du "dynamic cast" mais celui ci demande un nom... Et les nom varierons au cours du developpement de l'application.

    De plus, cette facon doit etre très performante car appélé dans un code "critique".

    Merci d'avance, en esperant ne pas être décu de ce language...

    J'ai entendu parler d'interface en Vc++, mais est ce que les compilateur linux le prenne aussi ?


    Résolu

  2. #2
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    En gros j'aimerais faire un type qui ne contient qu'une serie de fonction sans leur implémentation (probablement une virtuel pure)
    La représentation des interfaces en C++ est une classe abstraite ne contenant rien d'autre que des méthodes virtuelles pures
    et dans une fonction, appelé la méthode de ce qu'est réelement l'objet
    je ne comprends pas ce que tu veux dire
    J'ai entendu parler d'interface en Vc++, mais est ce que les compilateur linux le prenne aussi
    Le concept d'interface est indépendant (quoique si il s'agit des interfaces COM c'est du monde Windows)
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  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
    L'équivalent d'une interface est une classe abstraite uniquement composée de fonctions virtuelles pures.
    Toutes fois, le C++ permet (contrairement au Java) de définir nativement les invariants. Ce qui abouti à des classes "contrats" composées de fonctions membres publiques non virtuelles dont l'implémentation vérifira les invariants et appellera des fonctions virtuelles (pures au niveau du contrat), non publiques, qui seront redéfiniées par la suite.

    En Java comme en C++, le downcasting (fait avec des dynamic_cast<> en C++, un cast-à-la-C en Java) est généralement signe d'une erreur de conception.

    Il est étrange que tu parles de méthode virtuelle alors que Java, IIRC, n'a pas ce terme dans son vocabulaire.

    terme Java <-> équivalent direct C++
    "méthode" <-> "fonction (membre) virtuelle"
    "interface" <-> classe abstraite composée uniquement de fonctions virtuelles pures
    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
    Membre habitué
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 177
    Points : 196
    Points
    196
    Par défaut
    Je vais tenter d'etre plus clair sur mes but et merci déja de vos réponse.

    En gros j'aimerais faire une interface d'objet affichable. et laisser la possibilité a d'autre de créer leur objet au nom qu'il veulent.

    En c# je ferait une interface nomé Affichable qui aurais une méthode virtuel "void Affiche()".

    Les utilisateurs "overriderais" la méthode Affiche(). Et donc mes fonctionalité qui utiliserait les méthode de mon interface, utiliserais la méthode de l'utiliateur.


    Je en sais pas si c'est clair, alors je tente un autre exemple.
    Imaginons une class CT2 qui hérrite de CT1. CT1 et CT2 ne contienent que une methode virtuel nomé Test().

    La methode Test() de CT1 affiche "Class CT1" et celle de CT2 Affiche "Class CT1"

    si je fait :

    CT1 T1;
    CT2 T2;
    T1.Test();
    T2.Test();

    T1 = T2;
    T1.Test();

    Ca affiche en c++
    "Class CT1"
    "Class CT2"
    "Class CT1"

    En c# avec les override ca afficherais
    "Class CT1"
    "Class CT2"
    "Class CT2"

    Pourquoi ? Car il sais que l'objet est en réalité un CT2 donc applique la fonction des CT2 meme si dans la fonction c'est déclaré comme une classe de plus bas niveau...

    C'est le comportement c# que j'aimerais retrouvé...

    Et en java on peu utiliser les type des interface dans ses fonction, genre :
    void Fonction(MonInterface MonObjet)
    {
    MonObjet.MethodeDeLInterface();
    }

    Ce qui m'est impossible en C++ LEs class virtuel pure étant abstraite ...

  5. #5
    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 518
    Points
    41 518
    Par défaut
    Il suffit que la fonction soit virtuelle et non pas virtuelle pure...

    En java, toutes les méthodes non-statiques sont virtuelles.
    virtuelle pure == méthode abstraite
    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.

  6. #6
    Membre habitué
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 177
    Points : 196
    Points
    196
    Par défaut
    Citation Envoyé par Médinoc
    Il suffit que la fonction soit virtuelle et non pas virtuelle pure...

    En java, toutes les méthodes non-statiques sont virtuelles.
    virtuelle pure == méthode abstraite
    Le problème est que si je met une non virtuel pure dans mon interface, le linker dit qu'elle n'est pas définie. Et si je la défini, C'est celle la qui sera utilisé mais pas celle réel de l'objet comme le ferais c#...

  7. #7
    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
    Ca pue la tentative d'utilisation de sémantique de valeur (la partie copie) avec une hiérarchie polymorphe.
    En clair, interdiction de passer (en paramètres) des objets, issus de hiérarchies d'objets polymorphes, par valeur.

    Les références, constantes ou non, sont tes amies.
    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...

  8. #8
    Membre habitué
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 177
    Points : 196
    Points
    196
    Par défaut
    Citation Envoyé par Luc Hermitte
    Ca pue la tentative d'utilisation de sémantique de valeur (la partie copie) avec une hiérarchie polymorphe.
    En clair, interdiction de passer (en paramètres) des objets, issus de hiérarchies d'objets polymorphes, par valeur.

    Les références, constantes ou non, sont tes amies.
    Tu veux dire que le constructeur de copie me pourris tout ?
    et que donc en passant ca par des pointeur ca marcherais ?
    Ou alors j'ai pas compris ton explication

  9. #9
    Membre habitué
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 177
    Points : 196
    Points
    196
    Par défaut
    Excelent!!! c'etait bien ca. J'ai en gros garder l'habitude que tout soit des passage par référence en Java/C#. Merci beaucoup je vais editer mon message pour mettre Résolu.

  10. #10
    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 518
    Points
    41 518
    Par défaut
    Tu n'as pas à éditer le message: il y a un bouton "résolu" en bas à gauche, qui insère automatiquement le tag [Résolu] en noir...
    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.

  11. #11
    Membre habitué
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 177
    Points : 196
    Points
    196
    Par défaut
    Fait des 2 coté ^^.

    Mais j'avouerais ne pas vraiment saisir le concept de classes "contrats".

    Toutes fois, le C++ permet (contrairement au Java) de définir nativement les invariants. Ce qui abouti à des classes "contrats" composées de fonctions membres publiques non virtuelles dont l'implémentation vérifira les invariants et appellera des fonctions virtuelles (pures au niveau du contrat), non publiques, qui seront redéfiniées par la suite.

  12. #12
    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
    Pour les contrats:
    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
    struct Contract1 &#58; boost&#58;&#58;non_copyable 
    &#123;
        void f&#40;int i&#41; &#123;
            if &#40;i<42&#41; 
                throw std&#58;&#58;runtime_error&#40;"C1&#58;&#58;f&#58; précondition non respectée"&#41;;
            do_f&#40;i&#41;;
        &#125;
    private&#58;
        virtual void do_f&#40;int i&#41; = 0;
    &#125;;
     
    struct Impl &#58; Contract1, Contract2 &#123;
    private&#58;
        virtual void do_f&#40;int i&#41; &#123; ... code &#125;
        virtual int  do_g&#40;&#41; const &#123; ... &#125;
    &#125;;
     
    void fonction_client1&#40;Contract1 & c&#41;
    &#123; c.f&#40;55&#41;; &#125;
    void fonction_client2&#40;Contract2 const& c&#41;
    &#123; const i = c.g&#40;&#41;; ... &#125;
    .....
    Impl i;
    fonction_client1&#40;i&#41;;
    fonction_client2&#40;i&#41;;

    Pour ce qui est des copies et des hiérarchies d'objets polymorphes.
    La bonne règle simplifiée consiste à :
    - toujours interdire l'affectation
    - interdire la recopie,
    - ou la restreindre la recopie à une utilisation interne (protégée) destinée à la définition d'une fonction de clonage.
    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...

  13. #13
    Membre habitué
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 177
    Points : 196
    Points
    196
    Par défaut
    En faite, c'est forcé a ne pas faire l'erreure que j'ai faite ^^.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 18/11/2002, 10h12
  2. equivalent à explode?
    Par djridou dans le forum Langage
    Réponses: 3
    Dernier message: 28/08/2002, 12h01
  3. [Kylix] Equivalent ShellExec en CLX
    Par Anonymous dans le forum EDI
    Réponses: 7
    Dernier message: 14/08/2002, 12h55
  4. Equivalent à ExeName pour une DLL
    Par Smortex dans le forum Langage
    Réponses: 7
    Dernier message: 16/07/2002, 22h07
  5. [Kylix] equivalent winsock avec kylix
    Par Victor dans le forum EDI
    Réponses: 2
    Dernier message: 08/05/2002, 08h43

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