J'ai une classe A qui contient les fonctions membres foo() et bar() qui renvoient toutes deux un pointeur vers la classe B. Comment puis-je déclarer un tableau contenant les fonctions foo et bar en tant que variable membre dans la classe A? Et comment puis-je appeler les fonctions à travers le tableau?C++: Tableau de pointeurs de fonctions membres vers différentes fonctions
Répondre
La syntaxe de pointeur de fonction membre est ReturnType (Class::*)(ParameterTypes...)
, de sorte que par exemple .:
typedef B* (A::*MemFuncPtr)(); // readability
MemFuncPtr mfs[] = { &A::foo, &A::bar }; // declaring and initializing the array
B* bptr1 = (pointerToA->*mfs[0])(); // call A::foo() through pointer to A
B* bptr2 = (instanceOfA.*mfs[0])(); // call A::foo() through instance of A
Voir, par exemple this InformIT article pour plus de détails sur les pointeurs vers les membres.
Vous pouvez également regarder dans Boost.Bind et Boost.Function (ou leurs équivalents TR1) qui vous permettent de lier de manière opaque les pointeurs de fonctions des membres à une instance:
typedef boost::function<B*()> BoundMemFunc;
A instanceOfA;
BoundMemFunc mfs[] = {
boost::bind(&A::foo, &instanceOfA),
boost::bind(&A::bar, &instanceOfA)
};
B* bptr = mfs[0](); // call A::foo() on instanceOfA
Pour utiliser un tel tableau comme membre, notez que vous ne pouvez pas initialiser des tableaux à l'aide de la liste des initialiseurs de membres. Ainsi, vous pouvez lui attribuer dans le corps du constructeur:
A::A {
mfs[0] = &A::foo;
}
... ou vous utilisez un type qui peut effectivement y être initialisé comme std::vector
ou boost::array
:
struct A {
const std::vector<MemFuncPtr> mfs;
// ...
};
namespace {
std::vector<MemFuncPtr> init_mfs() {
std::vector<MemFuncPtr> mfs;
mfs.push_back(&A::foo);
mfs.push_back(&A::bar);
return mfs;
}
}
A::A() : mfs(init_mfs()) {}
Qu'est-ce que vous cherchez pour sont pointeurs vers les fonctions membres. Voici un petit exemple qui montre leur déclaration et l'utilisation:
#include <iostream>
class B {
public:
B(int foo): foo_(foo) {
std::cout << "Making a B with foo_ = " << foo_ << std::endl;
}
~B(void) {
std::cout << "Deleting a B with foo_ = " << foo_ << std::endl;
}
int foo_;
};
class A {
public:
A(void) {
funcs_[0] = &A::foo;
funcs_[1] = &A::bar;
}
B* foo(void) {
return new B(3);
}
B* bar(void) {
return new B(5);
}
// Typedef for the member function pointer, for everyone's sanity.
typedef B* (A::*BMemFun)(void);
BMemFun funcs_[2];
};
int main(int argc, char *argv[]) {
A a;
for (int i = 0; i < 2; ++i) {
A::BMemFun func = a.funcs_[i];
// Call through the member function pointer (the .* operator).
B* b = (a.*func)();
delete b;
}
return 0;
}
Le C++ FAQ section on pointers to member functions est là que je trouve toutes ces informations.
- 1. Fonction de pointeurs vers les fonctions membres en C++
- 2. Pointeurs vers les fonctions
- 3. tableau de N pointeurs vers des fonctions renvoyant des pointeurs vers des fonctions
- 4. Fonction de pointeurs vers les fonctions membres d'une classe parente
- 5. des pointeurs vers des fonctions
- 6. Fonctions membres C++ vs fonctions libres
- 7. Quel type peut contenir des membres-fonctions-pointeurs de classes de différences en C++?
- 8. Méta-programmation de modèles avec des pointeurs de fonctions membres?
- 9. Fonctions et pointeur vers des pointeurs
- 10. Pointeurs de fonctions thread-safe en C++
- 11. C++ comparaison de pointeurs de fonction membres
- 12. Comportement virtuel en stockant des pointeurs sur les fonctions membres
- 13. Besoin d'aide avec l'initialisation d'un tableau de pointeurs pour les fonctions membres
- 14. Passage des fonctions membres en C#
- 15. Types de données privés et fonctions membres
- 16. Casser les fonctions membres du public dans de nombreuses fonctions membres privées
- 17. Test d'unité de grandes fonctions non-membres
- 18. Mappage de méthodes natives Java aux fonctions membres C++
- 19. allocation de mémoire pour les fonctions membres en C++
- 20. Problème avec le passage de tableau de pointeurs à struct parmi les fonctions dans C
- 21. la liste des fonctions pointeur membres
- 22. Utilisation des fonctions membres des membres dans l'initialiseur de constructeur
- 23. Fonctions de tableau de PHP?
- 24. C++ vecteur de chaînes, pointeurs vers les fonctions, et la frustration qui en résulte
- 25. DataRow [] Fonctions agrégées C#
- 26. tableau de pointeurs vers un tableau char
- 27. Référence non définie aux fonctions membres
- 28. accès OBJECT de différentes fonctions dans VC++
- 29. membres de struct et pointeurs, C++
- 30. gérer le pointeur vers les fonctions membres dans la hiérarchie en C++
Vous pourriez également envisager l'utilisation de std :: function. – Puppy
@DeadMG: J'ai mentionné la version TR1 mais j'ai opté pour la version Boost car elle a la plus grande disponibilité. Personnellement, je considère que les versions C++ 0x ne sont pas assez répandues et que la nouvelle norme n'est pas encore finalisée. –
Ah, alors vous l'avez fait. Comme j'ai moi-même un compilateur C++ 0x, je ne suis pas habitué à voir les variantes de boost. – Puppy