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 :

Retrouver une fonction dans un autre namespace


Sujet :

Langage C++

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Novembre 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Novembre 2014
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Retrouver une fonction dans un autre namespace
    Bonjour,

    J'ai deux classes dérivant l'une de l'autre, portant le même nom (MyClass), mais définies dans deux namespaces différents.
    Une fonction foo() est définie dans ma classe de base, et surchargée dans ma sous classe (prototype différent).
    Cette dernière (dans la sous classe) doit appeler celle de la classe de base.

    Mais c'est alors que commence mon souci : je suis obligé d'être plus qu'explicite pour éviter une erreur de compilation de type "no matching function".

    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
    30
    31
     
    namespace nspaceA
    {
    	class MyClass
    	{
    		protected:
    			int foo(int n);
    	};
     
    	int MyClass::foo(int n)
    	{
    		return n+1;
    	}	
    }
     
    namespace nspaceB
    {
    	class MyClass : protected nspaceA::MyClass
    	{
    	  public:
    		 void foo();
    	};
     
    	void MyClass::foo()
    	{
    		int i=0;	
     
    		//i = foo(i); // => error: no matching function for call to 'nspaceB::MyClass::foo(int&)'
    		i = nspaceA::MyClass::foo(i); // solution OK, mais trop explicite à mon sens
    	}   
    }
    Ma solution n'est du coup pas très élégante. Si j'avais du polymorphisme à réaliser, ça serait d'ailleurs il me semble un point bloquant.
    Et puis c'est un comportement que je trouve étrange, d'autant plus qu'un renommage de la fonction foo() de la classe de base (en mettons fooA()) suffit à faire accepter l'appel sans avoir à préciser le namespace nspaceA::MyClass:: devant.

    Quelqu'un saurait il m'expliquer pourquoi, et s'il y a une alternative à ma solution ?

    Merci à vous.

  2. #2
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Points : 1 878
    Points
    1 878
    Billets dans le blog
    21
    Par défaut
    Eh bien... J'avoue ne pas trop comprendre tes scrupules à ajouter le nom du namespace à foo quand par ailleurs tu décides de donner à deux classes d'une hiérarchie le même nom et à les placer dans deux namespaces différents. Pour une solution plus élégante, je verrais bien, tout simplement, deux classes de noms différents dans un même namespace!

    Avec tes choix initiaux la seule solution un peu plus élégante que je verrais serait de placer:

    quelque part dans le fichier de la classe heritière.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Novembre 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Novembre 2014
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci Stendhal666 pour ta réponse.

    C'est vrai que de choisir le même nom pour ces deux classes ne parait pas très judicieux...

    Je reprends en fait le travail d'une autre personne qui, elle, a fait ce choix. Ce choix se comprend également dans le fait de vouloir spécialiser l'objet de base pour l'utiliser dans un système différent, mais avec au final un comportement identique (ce n'est grosso modo qu'une adaptation d'API). D'où la volonté de garder le même nom, mais de changer de namespace.

    Après, ce qui me gène dans le fait d'avoir à spécifier le namespace, c'est d'empêcher par cette précision l'utilisation éventuelle (si on le souhaitait) d'une redéfinition de cette fonction foo() dans la classe fille...

  4. #4
    Membre chevronné Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Points : 2 160
    Points
    2 160
    Par défaut
    Citation Envoyé par stendhal666 Voir le message
    Avec tes choix initiaux la seule solution un peu plus élégante que je verrais serait de placer:

    quelque part dans le fichier de la classe heritière.
    Juste avant l'appel de foo (comme dans l’idiome copy-and-swap).

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Je vois pas trop ce qui te dérange, surtout que t'as pas le choix.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    struct A { void foo() {} };
    struct B : A { void foo() {A::foo();} };
    Que tu hérites de A, ou de Toto::Namespace::BV2::AAA::.....::A, il faut juste écrire le nom du "truc" dont tu hérites.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    namespace TOTO { struct A { void foo() {} }; }
    struct B : TOTO::A { typedef TOTO::A BaseType; void foo() {BaseType::foo();} };
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Novembre 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Novembre 2014
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci à vous pour vos réponses.
    Si je veux redéfinir la fonction foo() de ma classe de base dans ma classe "fille", et l'utiliser dans cette dernière, je serai alors obligé de lors son appel de supprimer le "basetype" nspaceA::MyClass:: qui la précède. Cela manque un peu je trouve de flexibilité que donne ordinairemeent le C++. Je pensais qu'il y avait un moyen que le compilateur puisse automatiquement chercher la définition de foo() dans la classe de base, à moins qu'elle ne soit redéfinie dans la classe dérivée (auquel cas il prenait cette dernière).
    Mais je dois probablement en demander trop ;-)

  7. #7
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    C'est virtual qui permettra cela, à condition de manipuler une référence (ou un pointeur)
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

Discussions similaires

  1. Réponses: 4
    Dernier message: 15/09/2008, 14h43
  2. appel d'une fonction dans un autre fichier jss
    Par Davee dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 28/06/2008, 20h12
  3. appel d'une fonction dans un autre fichier
    Par funboard dans le forum Langage
    Réponses: 2
    Dernier message: 08/02/2008, 09h26
  4. appeler une fonction dans un autre programme
    Par elghadi_mohamed dans le forum Langage
    Réponses: 3
    Dernier message: 19/10/2007, 19h58
  5. Appeler une fonction dans un autre cadre !
    Par rich25200 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 01/11/2005, 13h01

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