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 :

Template et type dynamique


Sujet :

Langage C++

  1. #1
    Membre régulier
    Homme Profil pro
    Programmeur PHP
    Inscrit en
    Août 2009
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Israël

    Informations professionnelles :
    Activité : Programmeur PHP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2009
    Messages : 244
    Points : 114
    Points
    114
    Par défaut Template et type dynamique
    Salut,
    je suis en train de lire l'article de wikipedia sur les type system. J'ai vu qu'ils ont noté le c++ comme etant un language statiquement typé.
    Il est vrai que le type en c++ est atribué a la compilation, et les casting sont explicites.
    Mais il n'en demeure pas moins vrai que l'utilisation des templates rendent la langue un peu dynamique, non?

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Je crois que l'instanciation des templates se fait avant la compilation. C'est en quelque sorte une commodité d'édition.

  3. #3
    En attente de confirmation mail

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Points : 3 311
    Points
    3 311
    Par défaut
    Bonjour,

    De mémoire la classification des langages des des catégories liées au typage est un vrai bazar.

    Il me semble aussi que le cractère dynamique/statique du typage est lié au fait que dans un premier cas le type est déterminé à l'execution et dans l'autre à la compilation. Si c'est la définition que tu prends alors le C++ est plus ou moins entre les deux.

    En C++ il y a deux types pour chaque entités : le type statique, determiné à la compilation, et le type dynamique, qui représente le type réel d'un objet. L'un caractèrise donc l'entitée à travers laquelle on manipule l'objet, et l'autre l'objet en lui même.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    struct A {};
    struct B : A {};
     
    //main
    B b; //b est une variable dénotant un objet de type B
    //le type statique de b est donc B (c'est explicite)
    //le type dynamique est aussi B
    A* a = &b; //a est un pointeur initialisé avec l'addresse de notre objet de type B
    //le type statique de *a est A (c'est explicite, le compilateur le sait par la grammaire du C++)
    //le type dynmaique de *a est B, car quand on déréférence le pointeur on manipule l'objet pointé, qui ici est un objet de type B

  4. #4
    Membre émérite
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Points : 2 724
    Points
    2 724
    Billets dans le blog
    1
    Par défaut
    en ce qui concerne les template, lors de la compilation, le compilo va te genrer ta class pour les différent type de variable que tu va utiliser:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    template <typename T>
    clas toto
    {
      T var;
    };
     
    int main()
    {
      toto<int> t1;
      toto<char> t2;
      toto<std::string> t3;
    }
    va générer:

    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 toto
    {
     int var;
    };
     
    class toto
    {
     char var;
    };
     
    class toto
    {
     std::string var;
    };
    Je me souviens qu'il y a une methode avec g++ pour afficher ces fichiers générer temporairement lors de la cimpilation mais j'arrive pas a remettre la main dessus

  5. #5
    Membre régulier
    Homme Profil pro
    Programmeur PHP
    Inscrit en
    Août 2009
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Israël

    Informations professionnelles :
    Activité : Programmeur PHP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2009
    Messages : 244
    Points : 114
    Points
    114
    Par défaut
    Salut,

    Il me semble aussi que le cractère dynamique/statique du typage est lié au fait que dans un premier cas le type est déterminé à l'execution et dans l'autre à la compilation. Si c'est la définition que tu prends alors le C++ est plus ou moins entre les deux.
    C'est effectivement la definition que je connais.
    Seulement je ne comprend pas (d'apres ton exemple), comment se fait il qu'il soit a la fois dynamique et a la fois statique?

    Ce que je sais egalement, c'est que le type dynamique permet une affectation de A (pour reprendre ton exemple), vers une nouvelle structure C (par exemple). Ca marche a la compilation en tout cas. Le c++, me renverra une belle erreur de casting.

  6. #6
    Membre régulier
    Homme Profil pro
    Programmeur PHP
    Inscrit en
    Août 2009
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Israël

    Informations professionnelles :
    Activité : Programmeur PHP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2009
    Messages : 244
    Points : 114
    Points
    114
    Par défaut
    Le terme de Template est donc une commodité pour le programmeur, si je comprend bien. Mais en ce qui concerne le code, il n'est pas du tout approprié...

  7. #7
    Membre émérite
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Points : 2 724
    Points
    2 724
    Billets dans le blog
    1
    Par défaut
    L'exemple de la structure est une sorte d'héritage:

    L'objet A est de type A
    Et l'objet B est de type A spécialiser en B

    Lors de la remonter, le B se transforme en A en "perdant" une partie de ses données (tu ne pourra pas acceder aux données de B sans redscendre dans l'héritage)

    d'un point de vu statique sa sera un objet de type A mais d'un point de vue dynamique (donc par rapport a la mémoire effective de ton programme) sa sera un objet de type A spécialiser B

  8. #8
    Membre régulier
    Homme Profil pro
    Programmeur PHP
    Inscrit en
    Août 2009
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Israël

    Informations professionnelles :
    Activité : Programmeur PHP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2009
    Messages : 244
    Points : 114
    Points
    114
    Par défaut
    Merci, j'avais mal lu son exemple.

    tu ne pourra pas acceder aux données de B sans redscendre dans l'héritage
    Je ne savais pas qu'il etait possible d'acceder aux données de B par l'intermediaire d'un objet de la classe mère.

  9. #9
    Membre régulier
    Homme Profil pro
    Programmeur PHP
    Inscrit en
    Août 2009
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Israël

    Informations professionnelles :
    Activité : Programmeur PHP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2009
    Messages : 244
    Points : 114
    Points
    114
    Par défaut
    Il n'y a aucun probleme de Dangling Pointer dans cette exemple?

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 627
    Points : 30 692
    Points
    30 692
    Par défaut
    Salut,
    Citation Envoyé par IsraGab Voir le message
    Merci, j'avais mal lu son exemple.



    Je ne savais pas qu'il etait possible d'acceder aux données de B par l'intermediaire d'un objet de la classe mère.
    Ben, c'est ce que fait le dynamic_cast... :
    soit la hiérarchie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class A
    {
        public:
            virtual ~A();
    };
    class B : public A
    {
        public:
            virtual ~B()
    };
    Si tu as une collection de pointeurs vers A comme, par exemple,
    et que tu veux accéder à une fonction membre n'existant que pour B(en étant sur que ton objet est bel et bien de type B), tu utilisera un code proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    B * monB = dynamic_cast<B*>(tab[N]); // récupère un pointeur vers l'objet 
                                         // de type B, NULL si ce n'est pas un B
    monB->methodePropreAuxB();

  11. #11
    Membre régulier
    Homme Profil pro
    Programmeur PHP
    Inscrit en
    Août 2009
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Israël

    Informations professionnelles :
    Activité : Programmeur PHP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2009
    Messages : 244
    Points : 114
    Points
    114
    Par défaut
    Ok,
    Je suis daccord dans le cas ou j'utilise un dynamic_cast.
    Mais j'avais compris d'apres cet exemple que meme sans ce casting cela aurait été possible.

    Et, à partir du moment ou j'utilise cette fonction de cating "dynamique", cela prouve bien que le C++, utilise un typage statique, non? La conversion se fait a la compilation?
    Ou quoi que comme on utilise des pointeurs, il est possible que cela soit fait a l'execution?!
    ...Bref je sais pas trop

  12. #12
    Membre émérite
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Points : 2 724
    Points
    2 724
    Billets dans le blog
    1
    Par défaut
    Tu peux aussi le faire en mettant tes methode en virtual, tres tres pratique:

    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
     
    class A
    {
      virtual void affiche()
      {
        std::cout<<"A"<<std::endl;
      }
    };
     
    class B : public A
    {
      void affiche()
      {
        std::cout << "B" << std::endl;
      }
    }
     
    int main()
    {
      A typeA;
      B typeB;
     
      //affiche 'A'
      A.affiche();
      //affiche 'B'
      B.affiche();
    }
    J'utilise sa pour faire mes programme avec un chargement de module externe, par librairie Dynamique donc c'est pas gérer au moment de la compilation

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 30/07/2013, 21h01
  2. Réponses: 10
    Dernier message: 13/04/2009, 13h02
  3. Problème Type Dynamique Template
    Par M4xime dans le forum Bibliothèques
    Réponses: 1
    Dernier message: 21/01/2008, 23h59
  4. Template à valeur pseudo-Dynamique.
    Par urinou dans le forum Langage
    Réponses: 5
    Dernier message: 26/09/2005, 15h38
  5. Réponses: 10
    Dernier message: 27/04/2005, 11h26

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