tôi có 2 C++ Lớp câu hỏi:Vượt qua một hàm thành viên lớp như một tham số chức năng
Câu hỏi 1 là: Làm thế nào tôi có thể làm cho nó để tôi có thể vượt qua một hàm thành viên lớp như một tham số trong một chức năng & làm thế nào tôi có thể chạy/gọi chức năng đó? Và làm thế nào tôi có thể làm tương tự với một hàm tĩnh lớp. Nó có thể dễ dàng hơn để hiểu câu hỏi của tôi bằng cách nhìn vào mã này:
class DebuggingManager
{
string testLog;
bool test1()
{
// run test & return whether it passed or failed
}
static bool test2()
{
}
// How can I call a member function?
void catalogueTest(string testName, bool DebuggingManager::*nMemberFunction)
{
testLog += "Status of " + testName + ": " + ((*)nMemberFunction()) + "\n";
}
// How can I call a static function?
void catalogueTest(string testName, bool DebuggingManager::*nStaticFunction)
{
testLog += "Status of " + testName + ": " + DebuggingManager::nStaticFunction() + "\n";
}
// how do I pass a member function or a static function as a parameter in another function
bool runTests()
{
catalogueTest("Test of member functin", test1());
catalogueTest("Test of static functin", test2());
}
};
Câu hỏi thứ 2 là: Liệu nó xấu (hoặc nguy hiểm) thực hành để gọi một thành viên lớp (hoặc tĩnh) chức năng gián tiếp như trên. Tôi có một cảm giác thực sự là C++ xấu?
CHỈNH SỬA: Thực hiện lời khuyên Cảm ơn bạn đã trả lời, tôi đã cố thực hiện lời khuyên đó, rất nhiều thứ để có được đầu của tôi, điều này có đúng không?
// I have a feeling that ParameterList is incorect, would I pass the implicit obj as a parameter or is it done automatically like in normal object function calls?
typedef bool (DebuggingManager::*MemberPointerType)(ParameterList);
void catalogueTest(tstring testName, DebuggingManager* obj, MemberPointerType *nMemberFunction)
{
debugLog += _T("Status of ") + testName + _T(": ") + (obj->*nMemberFunction)() + _T("\r\n");
}
void catalogueStaticTest(tstring testName, bool DebuggingManager::nStaticFunction)
{
debugLog += _T("Status of ") + testName + _T(": ") + nStaticFunction + _T("\r\n");
}
Tôi ngạc nhiên này không được trả lời đã Có lẽ mọi người khác là mệt mỏi quá và không muốn để tra cứu cú pháp cho các con trỏ hàm thành viên trong lần thứ 500. –
xem http: // stackoverflow.com/questions/2463112/pointer-to-ac-class-thành viên-chức năng-as-a-toàn cầu-chức năng-tham số cho phép một liên kết đến http://www.parashift.com/c++-faq-lite/pointers- to-members.html có cú pháp và những điều cần lưu ý khi khai báo/sử dụng con trỏ hàm thành viên bình thường và tĩnh. Về điều xấu, tôi có thể nói: có lẽ không phải trong một trường hợp cụ thể (như thử nghiệm, hoặc có lẽ là những người khác), nhưng sẽ không tốt khi thực hành hàng ngày để viết mã, vì nó phức tạp, và vì có cơ chế tốt hơn cho hầu hết mọi thứ bạn sẽ sử dụng chúng. – shelleybutterfly