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

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Nouveau 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
    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 actif
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    34
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 34
    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 confirm�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    F�vrier 2005
    Messages
    5 505
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : France, Val de Marne (�le de France)

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

    Informations forums :
    Inscription : F�vrier 2005
    Messages : 5 505
    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 : 51
    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
    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 confirm�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    F�vrier 2005
    Messages
    5 505
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : France, Val de Marne (�le de France)

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

    Informations forums :
    Inscription : F�vrier 2005
    Messages : 5 505
    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
    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. 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