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 :

Problème: pointeur de fonction à partir d'un namespace


Sujet :

C++

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5
    Points : 3
    Points
    3
    Par défaut Problème: pointeur de fonction à partir d'un namespace
    Bonjour à tous!

    Tout d'abord, merci pour le droit d'admission à ce forum: il semble merveilleux!

    Venons-en maintenant au fait: je tente de créer une application pour un projet personnel. Je suis tombé sur une erreur que je suis incapable de résoudre. Je me suis créé une petite application à part qui reproduit l'erreur mais je ne réussis toujours pas à comprendre ce qui se passe.

    Est-ce que l'un d'entre vous aurais l'aimabilité de m'aider svp?

    Voici l'erreur obtenue:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    1>CClasse.obj : error LNK2005: "int (__cdecl* CClasse::ptFunct)(int,int)" (?ptFunct@CClasse@@3P6AHHH@ZA) déjà défini(e) dans main.obj
    Voici le contenu des fichiers de mon application-test:

    Fichier main.cpp
    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
     
    #include <iostream>
    #include "CClasse.h"
     
    int main()
    {
    	//Initialise the pointer of function
    	//Remarquez que je n'appel aucune fonction de CClasse!
    	//CClasse::Init();
     
    	int poulet1=1, poulet2=2, poulet3;
    	//Call the function via the function pointer
     
    	//poulet3 = CClasse::ptFunc(poulet1,poulet2);
    	return 0;
    }
    Fichier Classe.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #ifndef __CLASSE_H__
    #define __CLASSE_H__
     
    namespace CClasse{
    	//Pointer of function
    	int (*ptFunct)(int a, int b);
     
    	void Init();
    	int AddAndDisplay(int a, int b);
    };
     
    #endif //__CLASSE_H__
    Fichier Classe.cpp
    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
     
    #include "CClasse.h"
    #include <iostream>
     
    using namespace std;
     
    void CClasse::Init()
    {
    	ptFunct=AddAndDisplay;
    }
     
    int CClasse::AddAndDisplay(int a, int b)
    {
    	int temp;
    	temp=a+b;
    	cout<<"Additionner et afficher:"<<endl;
    	cout<<a<<" + "<<b<<" = "<<temp<<endl;
    	return(temp);
    }

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Salut,

    Le problème n'est pas spécialement lié au pointeur sur fonction, si tu mets un int i; ça sera aussi le cas.
    Et si tu ne mets pas de namespace le problème sera aussi toujours là (en fait pas de namespace équivaut au namespace par défaut, donc il y a toujours un namespace).

    Un include est une inclusion pure et simple d'un fichier, donc c'est comme si tu copiais le contenu de CClasse.h à la fois dans CClasse.cpp et dans main.cpp.
    Du coup tu te retrouves avec deux fois la même variable (en l'occurence ptFunct).

    Le plus sage est peut-être de mettre ça dans une classe ?

    MAT.

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Points : 1 069
    Points
    1 069
    Par défaut
    Pour résoudre temporairement ton problème, ptFunct doit être statique. Autrement, ptFunct sera défini deux fois (une fois dans main.o et une fois dans CClasse.o)

    Par contre, je me demande ce que tu bricoles. Ca ne ressemble pas à du C++. On dirait que tu utilises un namespace comme une classe.
    Ta fonction Init () ressemble à un constructeur.
    Pourquoi un pointeur de fonction ? Ca sent de l'héritage, comme on fait de l'objet en C.

    Evite __CLASSE_H__. Les noms commençant par deux underscores sont réservés au langage C++.

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5
    Points : 3
    Points
    3
    Par défaut Merci, mais...
    Bonjour à vous deux,

    Merci pour votre avis sur la question. J'ai effectivemenet essayé avec int i et tu avais raison le même type d'erreur se produit!

    J'ai donc essayé de faire une classe purement statique, mais sans succès: j'ai la même erreur. J'admet que l'utilisation du namespace est louche et que le concept de classe statique répond plus à mes besoins.

    Par ailleurs, à bien y repenser, je vais aller réviser mon polymorphismes... je crois que la conception de mon application ne s'en portera que mieux.


    Merci pour votre aide!

  5. #5
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Le mot clef static dans un namespace ne sert à rien, d'ailleurs il est déprécié en C++.
    En gros que tu le mettes ou non c'est pareil pour le compilateur.

    Par contre si tu le déclares extern dans le .h ça devrait "fonctionner" si tu veux persister dans cette voie...
    (enfin je crois, j'avoue que ça fait des années que je n'ai pas utilisé extern)

    MAT.

  6. #6
    screetch
    Invité(e)
    Par défaut
    static dans un namespace sert a kekchose, ca sert a ne pas exporter la cible pour le linker et donc a ce que la variable soit "locale au fichier"

  7. #7
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Ok je me suis un peu embalé.
    C'est néanmoins déprécié en C++ standard cf. http://www.informit.com/guides/conte...eqNum=210&rl=1

    MAT.

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Points : 1 069
    Points
    1 069
    Par défaut
    C'est néanmoins déprécié en C++ standard cf. http://www.informit.com/guides/conte...eqNum=210&rl=1
    C'est bien pour cela que j'avais dit que c'était une résolution temporaire, au moins pour qu'il comprenne son problème.

    Par ailleurs, à bien y repenser, je vais aller réviser mon polymorphismes... je crois que la conception de mon application ne s'en portera que mieux.
    Effectivemment, il y a des choses à revoir.

  9. #9
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Tu appelles un namespace "CClasse" ?!

    De plus, pourquoi utiliser ainsi une variable globale dans un namespace, plutôt qu'une variable static dans une classe ?

Discussions similaires

  1. Problème pointeurs et fonctions
    Par crimetime dans le forum Débuter
    Réponses: 10
    Dernier message: 25/06/2010, 13h40
  2. Réponses: 4
    Dernier message: 10/12/2009, 00h45
  3. Problème pointeur sur fonction static
    Par Julien_C++ dans le forum C++/CLI
    Réponses: 5
    Dernier message: 11/01/2008, 19h26
  4. Problème pointeur de fonction
    Par ired dans le forum C++Builder
    Réponses: 7
    Dernier message: 16/06/2007, 13h24
  5. Pointeurs de fonction à partir d'une Dll
    Par Figaro dans le forum C
    Réponses: 9
    Dernier message: 17/07/2006, 23h31

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