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 :

C++ et objets


Sujet :

C++/CLI

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 2
    Points : 2
    Points
    2
    Par défaut C++ et objets
    Bonjour,

    j'aurais quelques petites question techniques sur le c++ et la gestion des objets:

    Code d'exemple:
    Code C++ : 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
    class A
    {
    public:
    	A()
    	{
    		cout << "A::A\n" << endl;
    		toto();
    	}
    	virtual void			toto()
    	{
    		cout << "A::toto\n" << endl;
    	}
    };
    class B : public A
    {
    public:
    	B() : A()
    	{
    		cout << "B::B\n" << endl;
    	}
    	void					toto()
    	{
    		cout << "B::toto\n" << endl;
    	}
    	void					titi() {}
    };

    - tout d'abord je voulais avoir confirmation que :
    donne:
    Code Console : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    A::A
    A::toto
    B::B
    et pourquoi pas "B::toto" ???

    - Comment je peux faire pour comparer le type dynamique de deux instances ?
    j'ai essayé typeid, mais ca prend le type qui est "static" :
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    A		*a = new A();
    B		*b = new B();
    if (typeid(a).name() == typeid((A*)b).name())
    	cout << "comparaison des type static" << endl;

    - je voudrais tester si une methode existe dans un obj, mais si possible de facon opti (pas de comparaison de string ou autre...)
    par exemple :
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    A		*a = new A();
    B		*b = new B();
    A		*list[] = {a, b};
     
    for (int i = 0; i < sizeof(list) / sizeof(*list); i++)
    	if (/* ((B*)(list[i]))->titi  exists */)
    		((B*)(list[i]))->titi();
    ??

    merci d'avance pour vos reponses.

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 34
    Points : 16
    Points
    16
    Par défaut
    salut joraptor!

    dit c'est pas cette information que tu cherchais?

    http://doc.pcsoft.fr/fr-FR/?operateurs-comparaison

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 106
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 106
    Points : 12 189
    Points
    12 189
    Par défaut
    et pourquoi pas "B::toto" ???
    L'appel des méthodes virtuelles dans les constructeurs et dans les destructeurs sont à proscrire car le comportement n'est pas défini par la norme et le comportement est fonction du compilateur et des options de compilation.

    Avec certaines optimisations, il n'y aura ni "B::toto" ni "A::toto" mais un plantage pour appel de méthode "pure".

    - Comment je peux faire pour comparer le type dynamique de deux instances ?
    On est en C++/CLI.
    Si c'est des objets managés, ils ont la méthode "GetType".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (typeid(a).name() == typeid((A*)b).name())
    typeid retourne un "const type_info&" qui a un opérateur de comparaison donc le code est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (typeid(a) == typeid(b))
    - je voudrais tester si une methode existe dans un obj, mais si possible de facon opti (pas de comparaison de string ou autre...)
    par exemple :
    Cela sent déjà la conception bien boiteuse :
    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
     
    class Base
    {
    public:
        virtual void titi() = 0;
    }
     
    class A : public Base
    {
        virtual void titi()
        {
           ....
        }
    }
     
    class B : public Base
    {
        virtual void titi()
        {
           ....
        }
    }
     
    A *a = new A();
    B *b = new B();
    Base *list[] = {a, b};
     
    for (int i = 0; i < sizeof(list) / sizeof(*list); i++)
    		list[i]->titi();
    Sinon, en C++/CLI, il y a le réflexion, mais cela ne vous exonère pas d'avoir un peu de réflexion.

    P.S.: utilisez les containers de la stl, SVP.

  4. #4
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par bacelar Voir le message
    L'appel des méthodes virtuelles dans les constructeurs et dans les destructeurs sont à proscrire car le comportement n'est pas défini par la norme et le comportement est fonction du compilateur et des options de compilation.
    Bin, si... Il y a un comportement spécifié en C++ pur et dur (qui doit afficher A::toto, voir http://cpp.developpez.com/faq/cpp/?p...ons_virtuelles ).

    Il y a aussi un comportement défini pour les classes managées en C++/CLI, et il doit afficher B::toto.

    (merci pour le piège !)

    Par contre, j'ai l'impression que le post initial parle plus de C++ pur que de C++/CLI.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 106
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 106
    Points : 12 189
    Points
    12 189
    Par défaut
    Le mécanisme d'initialisation de la VTABLE n'est pas spécifié par la norme (de mémoire), des compilateurs différents en utilisent des différents et les options d'optimisation comme "NO_VTABLE" peuvent changer le mécanisme pour un même compilateur.
    Donc
    L'appel des méthodes virtuelles dans les constructeurs et dans les destructeurs sont à proscrire
    Si la norme spécifie le mécanisme montré dans la FAQ, c'est bien mais je connais bien peu de compilateur qui l'utilise systématiquement.

    La différence de comportement entre C++/CLI et C++, c'est normal, c'est du non spécifié et cela découle logiquement des mécanismes d’initialisations.

    Par contre, j'ai l'impression que le post initial parle plus de C++ pur que de C++/CLI.
    Heu, je suis nouveau dans cette partie du forum mais dans "Dotnet > Langages > C++ ", il y a Dotnet.

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Citation Envoyé par bacelar Voir le message
    Le mécanisme d'initialisation de la VTABLE n'est pas spécifié par la norme (de mémoire),
    Non ce n'est pas spécifié dans la norme. C'est un détail d'implémentation et si toutes les implémentations que je connais utilise des vtable, celles-ci (et le vpointeur associé) ne sont pas toujours identiques. Mais je ne connais pas d'autre mécanisme d'implémentation des fonctions virtuelles (en C++) et si tu en connais, je suis preneur de références.
    La norme ne spécifie que 1/ le type dynamique (Norme 1.3.3.) est utilisé pour résoudre l'appel des fonctions virtuelles (Norme 10.3 ¤6 et 5.2.2. ¤1)), 2/ L'appel d'une fonction virtuelle pure dans un constructeur/destructeur est un comportement indéterminé (Norme 10.4 ¤6) 3/ l'appel d'une fonction virtuelle non pure dans le constructeur ou le destructeur utilise la fonction de la classe en cours de construction (ou de ses classes de base, si elle ne l'a pas spécialisée). (Norme, 12.7 ¤3).
    Citation Envoyé par bacelar Voir le message
    des compilateurs différents en utilisent des différents et les options d'optimisation comme "NO_VTABLE" peuvent changer le mécanisme pour un même compilateur.
    Ce sont souvent des optimisations liées à l'endroit où la vtable est générée. La plus part des compilateurs la génère dans le fichier .cpp contenant la première définition de fonction virtuelle non inline. Mais cela peut être parfois plus compliqué (en particulier pour les classes abstraites). Il me semble que cela permet aussi de ne pas générer de vtable dans des cas particulier où on sait que l'on n'en n'a pas besoin.

    Citation Envoyé par bacelar Voir le message
    Si la norme spécifie le mécanisme montré dans la FAQ, c'est bien mais je connais bien peu de compilateur qui l'utilise systématiquement.
    Je n'ai pas compris de quel comportement tu voulais parler

    Sinon : Les fonctions virtuelles en C++ et
    XXIII. Comment ça marche ?

    [edit]: désolé du déterrage, je m'étais pas rendu compte des dates

Discussions similaires

  1. codage objet
    Par charly dans le forum Algorithmes et structures de données
    Réponses: 18
    Dernier message: 22/08/2002, 16h49
  2. algo : rotation d'objet 3d
    Par numeror dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 19/08/2002, 22h58
  3. Importer des objets de 3dsMax
    Par Anonymous dans le forum OpenGL
    Réponses: 3
    Dernier message: 06/05/2002, 13h53
  4. Peux t'on créer une copie locale de l'objet partagé?
    Par Anonymous dans le forum CORBA
    Réponses: 8
    Dernier message: 16/04/2002, 16h20
  5. [Kylix] Erreur objet
    Par Anonymous dans le forum EDI
    Réponses: 1
    Dernier message: 22/03/2002, 09h41

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