【发布时间】:2011-04-03 17:01:55
【问题描述】:
我有一个包含成员函数 foo() 和 bar() 的类 A,它们都返回一个指向类 B 的指针。如何将包含函数 foo 和 bar 的数组声明为类 A 中的成员变量?以及如何通过数组调用函数?
【问题讨论】:
我有一个包含成员函数 foo() 和 bar() 的类 A,它们都返回一个指向类 B 的指针。如何将包含函数 foo 和 bar 的数组声明为类 A 中的成员变量?以及如何通过数组调用函数?
【问题讨论】:
成员函数指针语法为ReturnType (Class::*)(ParameterTypes...),例如:
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
参见例如this InformIT article 了解有关指向成员的指针的更多详细信息。
您可能还想查看 Boost.Bind 和 Boost.Function(或它们的 TR1 等效项),它们允许您将成员函数指针不透明地绑定到实例:
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
要将这样的数组用作成员,请注意您不能使用成员初始化器列表来初始化数组。因此,您可以在构造函数主体中分配给它:
A::A {
mfs[0] = &A::foo;
}
...或者您使用可以在此处实际初始化的类型,例如 std::vector 或 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()) {}
【讨论】:
您正在寻找的是指向成员函数的指针。下面是一个简短的示例,展示了它们的声明和使用:
#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;
}
C++ FAQ section on pointers to member functions 是我找到所有这些信息的地方。
【讨论】: