2010-11-30 6 views
0

Je dois passer un pointeur de fonction d'une fonction membre à une autre classe. Je n'ai pas pu le compiler et j'ai l'erreur "référence non définie à classB :: classB (classA :: *) (std :: shared_ptr)". Quelqu'un peut il m'aider avec ça?Passer la fonction membre au pointeur de fonction

Merci.

classA{ 
    string functionA(share_ptr<int>); 
    void functionB(){ 
    classB* ptr = new classB(&classA::functionA); 
    } 
} 

//in other .h file 
classA; //forward declaration 

classB{ 
    classB(string (classA::*funcPtr)(shared_ptr<int>); //constructor 
} 
+0

Je l'ai eu ... il s'est avéré être la syntaxe correcte .. est juste que je n'ai pas nettoyer un ancien fichier avant de le compiler à nouveau .. gaspillé mes heures sur ce .. – Steveng

+0

une chose est votre constructeur Il manque une parenthèse fermante. De plus, il serait utile que vous ayez aussi posté votre fichier .cpp puisque l'entête n'affiche pas une implémentation du constructeur de classB. – Will

+0

-1 informations incorrectes et incomplètes dans la question. le code n'est pas votre code actuel. il ne devrait même pas compiler. et le code présenté n'est pas assez complet pour dire de quoi provient votre erreur de lien. –

Répondre

0

Juste pour rire, va répondre à cette question, même si vous l'avez dit compilé pour vous ...

// In a.hpp 
#include "b.hpp" // you need to include this because you will not 
       // be able to call B's constructor in your functionB() method 

class A 
{ 
public: 
    string functionA (shared_ptr<int>); // IIRC, needs to be public to call it 
             // from B's constructor. 

    // can be public/protected/private depending on where it's called ... 
    void functionB() { 
    B * ptrB = new B (&A::functionA); 
    } 
}; 

et

// In b.hpp 

// Forward declare class A 
class A; 
// To make the constructor of B cleaner, use a typedef. 
typedef string (A::*IntPtrToStrFn) (shared_ptr<int>); 

class B 
{ 
public: 
    B (IntPtrToStrFn fnptr); 
}; 

En ce qui concerne le style et la lisibilité du code va, cela est terrible - les liens les deux classes ensemble et reaks de l'odeur de code. Besoin de regarder une sorte de classe d'adaptateur ou un autre modèle de conception pour faire fonctionner les deux classes ensemble.

0

Sur la surface, cela ressemble à un problème de déclaration directe. Essayez de déclarer classA::functionB comme vous l'avez fait, puis définissez classA::functionB après la définition de classB.

2

Votre code que j'écris ceci:

classA{ 
    string functionA(share_ptr<int>); 
    void functionB(){ 
    classB* ptr = new classB(&classA::functionA); 
    } 
} 

ici:

  • share_ptr devrait être shared_ptr.

  • Un point-virgule est manquant à la fin de la définition de classe.

Ensuite,

//in other .h file 
classA; //forward declaration 

classB{ 
    classB(string (classA::*funcPtr)(shared_ptr<int>); //constructor 
} 

ici:

  • Il y a trois parenthèses gauche ( mais seulement deux parenthèses droite ).

  • Un point-virgule est manquant à la fin de la définition de classe.

Vous demandez au sujet d'une erreur de liaison, mais votre code ne devrait même pas compiler.

Lorsque vous indiquez "Je n'ai pas pu le compiler" cela semble correct. Quand vous dites "I get [undefined reference to ...]", c'est un mystère: avec la chaîne d'outils que vous utilisez évidemment, l'éditeur de liens ne devrait pas être invoqué quand la compilation échoue. En résumé, cette question contient des informations incorrectes et des réponses (par exemple, l'hypothèse que vous n'avez pas défini la fonction, ou l'hypothèse que vous l'avez définie quelque part, mais vous avez oublié de la lier, ou l'hypothèse que vous 're signaler des erreurs de construire quelque chose d'autre que votre code, etc.) serait pure conjecture.

Veuillez publier un petit programme complet qui compile et illustre l'erreur de liaison.

Vive & HTH.,

Questions connexes