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

MFC Discussion :

double question concernant les classes de classes


Sujet :

MFC

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 85
    Points : 35
    Points
    35
    Par défaut double question concernant les classes de classes
    J ai du mal a comprendre l utilité de la structure class de class comme illustrée dans le essage de MSDN error suivant:

    Compiler Error C2327
    'symbol' : is not a type name, static, or enumerator

    Code within a nested class attempts to access a member of the enclosing class that is not a type name, a static member, or an enumerator.
    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
     
    Example
     
    // C2327.cpp
    int x;
    class enclose {
    public:
       int x;
       static int s;
       class inner {
          void f() {
             x = 1;      // C2327; enclose::x is not static
             s = 1;      // ok; enclose::s is static
             ::x = 1;    // ok; ::x refers to global
          }
       };
    };
    Premiere question:
    quelqu un de ce Forum aurait-il une illustration pertinente de cette technique par un exemple concret de maniere a bien comprendre l utilite d une telle syntaxe qui pour moi reste tres exotique.


    deuxieme question:
    Modifions le code ci dessus par:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    class enclose {
    public:
       int x;
       static int s;
    int g( int &);
       class inner {
          void f() {
             x = 1;      // C2327; enclose::x is not static
             s = 1;      // ok; enclose::s is static
             ::x = g(s);    // ok; ::x refers to global
          }
       };
    };
    [Farscape: Merci]

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 85
    Points : 35
    Points
    35
    Par défaut
    CORRECTION



    Misprinting je le refais:


    J ai du mal a comprendre l utilité de la structure class de class comme illustrée dans le essage de MSDN error suivant:

    Compiler Error C2327
    'symbol' : is not a type name, static, or enumerator

    Code within a nested class attempts to access a member of the enclosing class that is not a type name, a static member, or an enumerator.
    Example

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    // C2327.cpp 
    int x; 
    class enclose { 
    public: 
    int x; 
    static int s; 
    class inner { 
    void f() { 
    x = 1; // C2327; enclose: is not static 
    s = 1; // ok; enclose::s is static 
    ::x= 1; // ok; : refers to global 
    } 
    }; 
    };
    Premiere question:
    quelqu un de ce Forum aurait-il une illustration pertinente de cette technique par un exemple concret de maniere a bien comprendre l utilite d une telle syntaxe qui pour moi reste tres exotique.


    deuxieme question:
    Modifions le code ci dessus par:



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class enclose { 
    public: 
    int x; 
    static int s; 
    int g( int &){}; 
    class inner { 
    void f() { 
    x = 1; 
    s = 1; 
    ::x = g(s);
    } 
    }; 
    };

    l utlisation de g est incorrect comment y remedier?

    re- [Loulou24 : merci]

  3. #3
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 279
    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 279
    Points : 11 015
    Points
    11 015
    Par défaut


    De plus, si il y a une erreur dans ton message, édite-le si personne n'y a répondu. Merci.

    Pour l'erreur, c'est parce que l'inner-class est une classe à part entière. Elle n'est pas liée à un objet en particulier, mais juste à une classe. Soit, tu ne peux accéder à enclose :: x.

    Cela permet de lier une classe à une autre. En dehors de l'englobante, l'inner-class n'a pas en général pas un grand intérêt. Je me sers de ce genre de trucs pour :
    - les firewalls de compilation (chercher "pimpl idiom")
    - définir les noeuds d'une liste ; p.ex. L'implémentation de la liste et la présence des noeuds est un détail qui n'a pas à être utilisable à l'extérieur de la classe.
    - définir des couches qui contiennent divers participants d'une communication, chacun ayant son rôle. (chercher "mixin layers" et samaragdakis)
    - définir des proxies qui vont offrir une vue sur un objet que l'on ne peut pas manipuler directement.
    - ...

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 85
    Points : 35
    Points
    35
    Par défaut
    tres bien pour l utilité
    cependant je n ai pas compris si je pouvais acceder, dans la inner class, a une methode définie dans la enclose class et si oui quel syntacxe je dois utiliser.

    De plus dans le cpp
    la declaration d'une methode del inner class se fait comme ci dessous?

    int enclose::inner::f(..){ ... }

  5. #5
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 279
    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 279
    Points : 11 015
    Points
    11 015
    Par défaut
    L'inner class est indépendante des objets!. Si tu veux pouvoir appeler une fonction membre non statique de la classe englobante, il faut disposer d'un objet de cette classe. Ce qui fait que parfois (cas des proxies) on initialise les objets de type inner avec un objet de type outer.

    Pour la syntaxe pour ce qui est de définir les fonctions membres de inner, oui, c'est bien ça.

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 85
    Points : 35
    Points
    35
    Par défaut
    je pense que dire que c est independant c est un peu for!

    examinons l exemple de MSDN:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    // C2327.cpp
    int x;
    class enclose {
    public:
       int x;
       static int s;
       class inner {
          void f() {
             x = 1;      // C2327; enclose::x is not static
             s = 1;      // ok; enclose::s is static
             ::x = 1;    // ok; ::x refers to global
          }
       };
    };
    la ligne x=1 refeère a la propriete int x instancier dans la classe enclose. Je cherche a faire la meme chose pour une function.


    Si j ai bien compris il faut que je declare un objet de type enclose dans la inner class.
    Je cherche le moyen concret et le plus economique pour que

    void enclose::g( int &) soit vu dans la classe enclose

    merci

    et merci pour les eclaircisssement que tu m as deja apporte

  7. #7
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 279
    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 279
    Points : 11 015
    Points
    11 015
    Par défaut
    Par pitié !!!!

    Le bout de code de la MSDN library signale que la ligne "x = 1" génère une erreur qui répond au joli petit nom accrocheur de C2327. Générer une erreur avec une fonction est tout aussi facile.

    Il y a bien indépendance via-à-vis des objets (objets != classe).

    Une solution (mais ca dépend du problème exact)
    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
    class outer
    {
        struct inner {
            inner(outer & o) : o_(o) {};
            void f() { o_.g() ; }
        private:
            outer & o_;
        };
     
    public:
        inner bla() { return inner(*this); }
        void g() { .... }
    };
    ...
    outer z;
    z.bla().f();

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 85
    Points : 35
    Points
    35
    Par défaut
    oui je suis desole je suis con c etait justemement le poropos de cette erreur: il faut que je ne suis pas reveuiller

    c est instanctiation lors le construction du inner c est ce qui me semblait naturel vu tes reponses precedentes.
    si je souhaite que le construction o(o_) se fasse de maniere economique
    j ai interet d'utiliser le mot static


    ai je raison dans ce qui suit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class A{
    public:
    static int a;
             int b;
     
    A(int & a_, int & b_):(a(a_),b(b_){};
    A(int & b_):b(b_){};
    }
    lors de l execution
    A r(1,2);
    r.a=1 est deja connu si bien

    A rr(2);

    rr.a=1 meme s il utilise le second constructeur

    si j ai faux peux tu me suggerer autre chose! encore merci

Discussions similaires

  1. quelque question sur les diagramme de classe
    Par sheridan08 dans le forum Diagrammes de Classes
    Réponses: 4
    Dernier message: 06/04/2012, 19h33
  2. Réponses: 2
    Dernier message: 21/05/2009, 12h31
  3. P'tite question concernant les Class ou Module
    Par arnofly dans le forum VB.NET
    Réponses: 15
    Dernier message: 18/04/2009, 17h01
  4. question concernant la visibilité de classes
    Par thebloodyman dans le forum Langage
    Réponses: 5
    Dernier message: 11/09/2006, 09h21
  5. [Débutant] Deux questions concernants les vues
    Par 13obscur dans le forum Eclipse Platform
    Réponses: 1
    Dernier message: 19/04/2005, 14h29

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