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 :

Probleme de linkage d'un attribut (statique) pointeur sur fonction


Sujet :

Langage C++

  1. #1
    Membre confirmé Avatar de donkeyquote
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 195
    Par défaut Probleme de linkage d'un attribut (statique) pointeur sur fonction
    Bonjour,

    J'obtiens l'erreur de linkage suivant qui est en train de me rendre fou !! :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Building target: octaveTest
    Invoking: GCC C++ Linker
    g++ -L/usr/lib/octave-3.2.4/ -o"octaveTest"  ./src/f.o ./src/octaveTest.o   -loctave
    ./src/f.o: In function `F::B(ColumnVector (*)(double))':
    /home/toto/workspace/octaveTest/Debug/../src/f.cpp:53: undefined reference to `F::_Bf'
    La definition de ma classe est :
    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
     
    #ifndef F_H_
    #define F_H_
     
    #include <octave/oct.h>
     
    class F {
    public:
    	virtual ~F();
     
    	static ColumnVector RightHandVector(const ColumnVector & iY, double iT);
    	static void SetA(const Matrix & iA);
    	static void SetB(const ColumnVector & iB);
    	static void SetC(const ColumnVector & iC);
     
    	static ColumnVector B(double iT);
    	static void B( ColumnVector (*f)(double iT) );
     
    private:
    	F();
    	static Matrix _A;
    	static ColumnVector _B; // Stand-alone time functions
    	static ColumnVector (*_Bf)(double iT);
    	static ColumnVector _C; // Constants
    };
     
     
     
    #endif /* F_H_ */

    Dans le .cpp de l'implementation de la classe, j'ai :

    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
    #include "f.h"
    #include <math.h>
    
    // Initialising the static attributes
    Matrix F::_A;
    ColumnVector F::_B;
    ColumnVector F::_C;
    
    ColumnVector (F::*_Bf)(double iT) = NULL;
    
    .... BLA BLA ...
    
    
    void F::B( ColumnVector (*f)(double iT) )   // Cela pretend etre une setter de _Bf
    {
    	_Bf = f;  // ICI UNE ERREUR DE LINKAGE
    }
    
    .... BLA BLA ...
    
    
    ColumnVector F::RightHandVector(const ColumnVector & iY, double iT)
    {
    	return(F::_A*iY + _Bf(iT) + F::_C);  // ICI UNE ERREUR DE LINKAGE
    }

    Pouvez-vous me donner un coup de main avec cela svp ? Qu'est ce que je fais mal ?

    Je vous remercie d'avance !

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Peut être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ColumnVector (*F::_Bf)(double iT) = NULL;
    De tout façon, dans un cas pareil, je créerais un typedef pour le pointeur de fonction.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef ColumnVector (*PtrFunction)(double iT);
    et ensuite j'utiliserais ce nouveau typedef dans mes paramètres

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    static void B(PtrFunction f);
    ...
    static PtrFunction _Bf;
    Cela éclaircie un peu la lecture et l'on voit directement que l'on parle d'un pointeur de fonction si le typdef est bien nommé.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    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,

    Je rajoute à la réponse de ram qu'on décourage les noms commençant par '_' car ils sont en général réservés aux implémentations des compilateurs (cf cette entrée de la F.A.Q. : Quels sont les identificateurs interdits par la norme ?).

Discussions similaires

  1. Réponses: 10
    Dernier message: 03/02/2005, 13h09
  2. Réponses: 5
    Dernier message: 12/01/2005, 20h58
  3. pointeurs sur fonction en C++
    Par cemoi dans le forum C++
    Réponses: 7
    Dernier message: 29/11/2004, 13h19
  4. [langage] Pointeur sur fonction
    Par Fanch.g dans le forum Langage
    Réponses: 2
    Dernier message: 02/10/2004, 10h43
  5. Declaration de fonction retournant un pointeur sur fonction
    Par pseudokifaitladifférence dans le forum C
    Réponses: 5
    Dernier message: 11/08/2003, 19h37

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