将函数传递给同一个类中的另一个函数

时间:2013-12-21 23:17:57

标签: c++

我有一个名为DrawerApp的类,其中包含这些函数  _genericLoadFromFileRun

我想从下面的_loadFromFileHelper函数中调用每个函数_loadFromBinHelperRun

void DrawerApp::Run()
{
    _genericLoadFromFile(_loadFromFileHelper);
    _genericLoadFromFile(_loadFromBinHelper);
}

_genericLoadFromFile看起来像这样:

bool DrawerApp::_genericLoadFromFile(static bool (DrawerApp::*helperFunc)(string)) 
{
/* do some stuff */
    string fileName = 'Test';
    success = (this->*helperFunc)(fileName);

}

但不幸的是我收到以下错误:

DrawerApp::_loadFromFileHelper': function call missing argument list; 
use '&DrawerApp::_loadFromFileHelper' to create a pointer to member 

还有这个警告:

Warning 1   warning C4042: 'helperFunc' : has bad storage class 

如何正确执行此操作?我不知道我做错了什么。 谢谢

修改

当我尝试编辑它时,错误建议&DrawerApp::_loadFromFileHelper我收到另一个错误:

Error   2   error LNK2019: unresolved external symbol "private: bool __thiscall DrawerApp::_loadFromFileHelper(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (?_loadFromFileHelper@DrawerApp@@AAE_NV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) referenced in function "private: void __thiscall DrawerApp::Run(void)" (?Run@DrawerApp@@AAEXXZ)    

Error   3   error LNK1120: 1 unresolved externals   

2 个答案:

答案 0 :(得分:0)

这个问题非常愚蠢。我没有正确实现这些方法(忘了把DrawerApp::放在他们面前。

抱歉弄乱你的头: - )

答案 1 :(得分:0)

假设辅助函数被声明为static,则不需要将它们作为成员函数指针调用 - 它们只能被称为普通函数指针,例如:尝试这个完整,可编译和可链接(虽然不是非常实用)的例子:

#include <string>

using namespace std;

class DrawerApp {
    public:

    void Run()
    {
        _genericLoadFromFile(_loadFromFileHelper);
        _genericLoadFromFile(_loadFromBinHelper);
    }

    static bool _loadFromFileHelper(string x) 
    {
        return true;
    }

    static bool _loadFromBinHelper(string x) 
    {
        return true;
    }

    bool _genericLoadFromFile(
            bool (*helperFunc)(string)) 
    {
        /* do some stuff */
        string fileName = "Test";
        bool success = (*helperFunc)(fileName);
        return success;
    }
};

int main () {
    DrawerApp a;
    a.Run();
    return 0;
}

这也表明没有必要在_genericLoadFromFile()的函数定义中显示存储类。