我有一個包含成員函數foo()和bar()的類A,它們都返回一個指向類B的指針。我如何聲明一個包含函數foo和bar的數組作爲A類中的成員變量?我如何通過數組調用函數?C++:不同函數的成員函數指針數組
6
A
回答
17
成員函數指針語法是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()) {}
2
你要找什麼因爲指向成員函數。下面是顯示了它們的聲明和使用很短的例子:
#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是,我發現所有這些信息。
相關問題
- 1. C++函數成員指針
- 2. C++成員函數指針
- 3. C++成員函數指針
- 4. C++指向成員函數的指針
- 5. C++接受成員函數指針和外部函數指針
- 6. 指針數據成員函數C++
- 7. 成員函數返回指向成員函數的指針
- 8. 模板函數指針成員函數
- 9. 函數指向模板類成員函數的指針? (C++)
- 10. C++中的類成員函數指針
- 11. C++中的成員函數指針
- 12. 類成員函數指針
- 13. boost成員函數指針
- 14. 與成員函數指針
- 15. 成員函數指針
- 16. 成員函數指針
- 17. 成員函數指針指向函數指針?
- 18. 將指針指向成員函數作爲函數指針
- 19. 調用指針到成員函數C++
- 20. C++成員函數指針問題
- 21. C++指針模板函數類成員
- 22. C++類成員指針全局函數
- 23. C++成員函數指針,聲明
- 24. C++:函數指針和類成員
- 25. C++/CLI:成員函數指針隊列
- 26. C++類成員函數C結構函數指針
- 27. 用於重載成員函數的成員函數指針
- 28. 成員函數指針,傳遞函數作爲非成員函數的參數
- 29. 函數指針在C++中的成員函數
- 30. 將成員函數指針轉換爲普通函數指針
你也可以考慮使用std :: function。 – Puppy 2010-08-25 13:21:10
@DeadMG:我提到了TR1版本,但是因爲具有最廣泛的可用性,所以選擇了Boost版本。我個人認爲C++ 0x版本不夠普及,新標準還沒有最終確定。 – 2010-08-25 13:34:35
啊,所以你做到了。由於我自己得到了一個C++ 0x編譯器,我不習慣看到這些增強變體。 – Puppy 2010-08-25 14:04:29