Tengo una clase A que contiene funciones miembro foo() y barra() que devuelven un puntero a clase B. ¿Cómo puedo declarar una matriz que contiene las funciones foo y barra como una variable miembro en la clase A? ¿Y cómo llamo a las funciones a través de la matriz?C++: matriz de punteros de función miembro a diferentes funciones
Respuesta
La sintaxis puntero de función miembro es ReturnType (Class::*)(ParameterTypes...)
, por lo que por ejemplo .:
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
Véase, por ejemplo this InformIT article para más detalles sobre punteros a los miembros.
También puede ser que desee ver en Boost.Bind y Boost.Function (o sus equivalentes TR1) que le permiten enlazar opaca las de función triples miembros a una instancia:
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
utilizar una matriz tal como una miembro, tenga en cuenta que no puede inicializar matrices utilizando la lista de inicializadores de miembros. De este modo se puede asignar a cualquiera en el cuerpo del constructor:
A::A {
mfs[0] = &A::foo;
}
... o usar un tipo que realmente puede ser inicializado allí como std::vector
o 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()) {}
Lo que estás buscando para son punteros a funciones miembro. Aquí está una muestra corta que muestra su declaración y uso:
#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;
}
El C++ FAQ section on pointers to member functions es donde me encontré con toda esta información.
- 1. C++: Uso de punteros de función con funciones de miembro
- 2. Punteros de función para funciones de miembro en C++
- 3. C++ Punteros a funciones de miembros Herencia
- 4. Matriz de punteros de función en C
- 5. Usando decltype con punteros de función miembro
- 6. Guardar punteros a la función de miembro en el mapa
- 7. Llamando punteros a funciones C++ de las bibliotecas C
- 8. C++ punteros a objetos de clase y acceso a funciones miembro
- 9. Matriz de punteros de función en Java
- 10. C++ funciones de miembro volátil
- 11. matriz de punteros C
- 12. C sintaxis para funciones que devuelven punteros de función
- 13. C++ efectivo Artículo 23 Prefiere funciones no miembro no miembro a funciones miembro
- 14. Punteros de función
- 15. Uso de decltype con punteros de función de miembro virtual
- 16. array de N punteros a funciones que devuelven punteros a las funciones
- 17. punteros de funciones de fundición con diferentes tipos de punteros como un argumento
- 18. punteros de matriz C++ [] o ++
- 19. Funciones de miembro no miembro frente a miembro en Python
- 20. Plantillas, punteros de función y C++ 0x
- 21. C++ Punteros de función vs Switch
- 22. Punteros de función en C#
- 23. Punteros de varias funciones
- 24. matrices y matrices a funciones como punteros y punteros Pasando a los punteros en C
- 25. Punteros de función en el operador de dirección C "innecesarios"
- 26. Funciones no miembro no miembro frente a funciones privadas
- 27. ¿La función de miembro de soporte C++ hace referencia?
- 28. Función de miembro de clase de enlace a función c
- 29. ¿Cómo hash y compara una función de puntero a miembro?
- 30. Funciones de miembro estático
También podría considerar un buen uso de std :: function. – Puppy
@DeadMG: mencioné la versión TR1 pero opté por la versión Boost ya que tiene la disponibilidad más amplia. Personalmente, considero que las versiones de C++ 0x no están suficientemente extendidas y el nuevo estándar tampoco se ha finalizado todavía. –
Ah, así lo hiciste. Como obtuve un compilador C++ 0x, no estoy acostumbrado a ver las variantes de impulso. – Puppy