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 :

[Namespace] Incompréhension avec un classe abstraite


Sujet :

C++

  1. #1
    Invité
    Invité(e)
    Par défaut [Namespace] Incompréhension avec un classe abstraite
    Bonsoir

    Voilà, j'ai quelques doutes sur ma compréhension des namespace.
    En effet, j'ai dans mon projet une classe abstraite Personnage. Celle-ci décrit des méthodes communes à ses filles, à savoir Guerrier, Sorcier...

    Pour facilier la compréhension du code, et pour ne pas bloquer les noms de méthodes dans l'ensemble du programme, j'ai voulu créé un classement à l'aide des espaces de nom.

    J'ai donc, dans un premier temps, mis ma classe Personnage dans un namespace Personnage.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    namespace Personnage {
    class Personnage
    { ... };
     
    } // FIN namespace
    Donc une première question : cela ne risque-t-il pas de poser certains problèmes lors du développement, étant donné que l'espace de nom possède le même nom que la classe ?



    Ensuite, j'ai fais comme suit au classes filles :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    namespace Personnage {
       namespace Classe {
     
    class Guerrier : public Personnage
    { ... };
     
       } // FIN GUERRIER
    } // FIN namespace

    Donc, pour déclarer un guerrier, je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Personnage::Classe::Guerrier warrior;
    Ce code fonctionne.
    Seulement, je pensais que je n'étais pas obligé de créer l'espace de nom Personnage, étant donné que je déclare une classe du même nom.
    Donc je croyais que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Personnage::Guerrier warrior; //(sans l'espace de nom Classe)
    ou
    Personnage::Classe::Guerrier warrior; // (avec l'espace de nom Classe)
    fonctionnaient tout aussi bien.

    Mais je me rend compte que ce n'est pas le cas. La compilation échouant.
    Pour ma part, je présume que ça vient du fait que la classe Personnage est abstraite (donc non instanciable).



    Si certains peuvent éclaircir ma petite lanterne, je suis tout ouïe
    Dernière modification par Invité ; 26/03/2009 à 09h43.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    327
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 327
    Points : 402
    Points
    402
    Par défaut
    Bonjour,
    Un namespace peux avoir le même non qu'une classe il y a aucun problème.
    Par contre le mot cle class dans C++ ne prend pas de e.
    A bientôt

  3. #3
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par wakan Voir le message
    Par contre le mot cle class dans C++ ne prend pas de e.
    A bientôt
    Au temps pour moi, c'est une erreur de frappe.
    Merci

  4. #4
    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
    Bonsoir,
    Citation Envoyé par Furanku Voir le message
    J'ai donc, dans un premier temps, mis ma classe Personnage dans un namespace Personnage.
    J'y vois surtout un risque de confusion ... pour celui qui voudra relire le code dans 6 mois (et peut-être même avant). Pour reprendre les propos d'un sage qui murmure à l'oreille des développeurs : "un code est plus souvent relu qu'exécuté."

  5. #5
    Invité
    Invité(e)
    Par défaut
    Au niveau de la compréhension, je me doute que ça peut porter à confusion. Ce que je voulais réellement savoir c'est si ça fonctionnait en dehors de ce problème de compréhension.

    Je changerai le nom de la classe mère plutôt que du namespace
    Par contre, simple question de vérification : une classe dérivée ne fait pas partie du namespace de sa classe mère ?

    Je veux dire, on ne peut pas faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Personnage::Guerrier warrior;
    si Guerrier hérite de Personnage.

    J'arrive pas très bien à comprendre pourquoi, étant donné que Guerrier est un type de Personnage.

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 35
    Points : 39
    Points
    39
    Par défaut
    Pour instancier une classe, tu "creuses" dans les espaces de noms, pas dans les classes parentes.

    Donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Personnage::Guerrier warrior;
    n'est pas valide car le namespace Personnage ne contient que la classe Personnage.

    Tu es oblige de passer par le namespace Personnage, puis le namespace Classe. Par contre, je ne comprend pas pourquoi le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Personnage::Classe::Guerrier warrior; // (avec l'espace de nom Classe)
    ne compile pas (a moins que le problème soit ailleurs).


    De la même manière, tu aurais pu déclarer la classe Guerrier de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    class Guerrier :: Personnage::Personnage
    {
       ...
    }

    Je remarque d'ailleurs que dans ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    namespace Personnage {
       namespace Classe {
     
    class Guerrier
    { ... };
     
       } // FIN GUERRIER
    } // FIN namespace
    Personnage::Classe::Guerrier, ne dérive pas de Personnage:: Personnage. Il y a peut être une autre incompréhension sur ce point.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Solkien Voir le message
    Par contre, je ne comprend pas pourquoi le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Personnage::Classe::Guerrier warrior; // (avec l'espace de nom Classe)
    ne compile pas (a moins que le problème soit ailleurs).
    Pas de soucis de ce côté là, ça compile sans problème (si bien sûr je déclare les espace de nom Personnage et Classe).
    Mais je pensais que sans espace de nom déclaré, on pouvait déclarer une classe dérivée de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ClasseMere::ClasseFille objet;

    Citation Envoyé par Solkien Voir le message
    De la même manière, tu aurais pu déclarer la classe Guerrier de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    class Guerrier :: Personnage::Personnage
    {
       ...
    }
    Tu voulais dire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    class Guerrier : public Personnage::Personnage
    {
       ...
    }
    ?
    Dans le cas contraire, je ne comprend pas


    Citation Envoyé par Solkien Voir le message
    Je remarque d'ailleurs que dans ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    namespace Personnage {
       namespace Classe {
     
    class Guerrier
    { ... };
     
       } // FIN GUERRIER
    } // FIN namespace
    Personnage::Classe::Guerrier, ne dérive pas de Personnage:: Personnage. Il y a peut être une autre incompréhension sur ce point.
    Oui, c'est juste une seconde mauvaise saisie de ma part. La classe Guerrier hérite bien de Personnage dans mon programme

  8. #8
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    Je pense que le code :

    ne compile pas car tu es à l'intérieur du namespace Personnage.

    Comme tu es à l'intérieur du namespace Personnage, que Personnage existe dans ce namespace, il cherche Guerrier... dans la classe Personnage.

    devrait compiler.

    Mais comme tu peux le constater, c'est source de confusion et je ne saurais que te déconseiller d'avoir un namespace et une classe de même nom dans ce namespace.

    D'ailleurs, je ne suis pas grand fan des namespaces, pour moi, une lib = un namespace, et pour tout ce qui est dans le main, pas besoin de namespace.

  9. #9
    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
    Citation Envoyé par white_tentacle Voir le message
    D'ailleurs, je ne suis pas grand fan des namespaces, pour moi, une lib = un namespace, et pour tout ce qui est dans le main, pas besoin de namespace.
    Disons qu'il faut savoir ne pas en abuser. Je pense aussi qu'un namespace doit avoir une cohérence : regrouper des choses qui vont ensemble... et qui pourrait effectivement correspondre à une lib.

  10. #10
    Invité
    Invité(e)
    Par défaut
    Merci de vos réponses, je pense que je vais faire autrement. Le code n'est pas forcément plus clair avec.

    Bonne journée

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

Discussions similaires

  1. [2.x] Relation 1n avec des class abstraites
    Par pou4ever dans le forum Symfony
    Réponses: 0
    Dernier message: 16/01/2014, 11h58
  2. probleme Avec les classes Abstraites
    Par thibaultc dans le forum C++/CLI
    Réponses: 3
    Dernier message: 02/12/2013, 10h58
  3. JFace Databinding avec une classe abstraite
    Par anthony.pa dans le forum SWT/JFace
    Réponses: 0
    Dernier message: 03/09/2013, 17h01
  4. problème avec les classes abstraite avec C#
    Par takfa2008 dans le forum C#
    Réponses: 1
    Dernier message: 29/06/2009, 10h25
  5. Problème d'héritage avec une classe abstraite
    Par Ph.denis dans le forum C++
    Réponses: 7
    Dernier message: 22/03/2008, 10h37

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