如何在C ++中调用不存在的函数

时间:2017-10-30 12:55:35

标签: c++ events

所以,我想知道如何从标题中调用函数...

为了更好地解释它,我有一个头文件,类似于游戏库。

我想调用程序主要部分中的某些函数(动态函数),但我希望不需要这些函数。

所以,如果我点击一个热键组合,我会在程序的主要部分调用一个名为“hotkeyHit”的函数,但首先我需要检查它是否存在。我正在实施某种“事件系统”。 那就是我撞墙的地方...... 首先我不知道如何检查Main中是否有该函数,如果没有函数调用那我就无法编译,最后,我不能第二次声明相同的函数,让我没有明显的选择。

所以现在我想知道我该怎么做才能按照我想要的方式工作。

提前致谢

3 个答案:

答案 0 :(得分:0)

下面有一些示例,希望能够解释我的评论。在这里,CBaseHandler类中的方法是故意为空的。您的事件处理程序引用CBaseHandler,在此示例中尝试处理按键和鼠标点击。但是,处理程序的具体实现CHandler只实现了Keypress处理程序(在这种情况下只是通过打印字符串,但你可以做任何你想做的事情)

当事件处理程序运行时,只有Keypress会执行任何操作。大概你可能想要在现实生活中的一些描述中称之为。

现在,库中的事件处理程序循环可以为您需要的任何目的实现事件处理程序的任何实现。

#include <iostream>

class CBaseHandler
{
public:
    virtual void handleKeyPress(int i)
    {
    }

    virtual void handleMouseClick(int i)
    {
    }

};

class CHandler : public  CBaseHandler
{
public:
    virtual void handleKeyPress(int i)
    {
        std::cout << "Derived - KP" << std::endl;
    }
};

void DoHandle(CBaseHandler& handler)
{
    handler.handleKeyPress(4);
    handler.handleMouseClick(0);

}

int main() {
    CHandler myhandler;

    DoHandle(myhandler);
}

答案 1 :(得分:0)

如果你在头文件中声明了一个函数但没有在任何地方定义,那么编译就可以了。但是,如果您尝试在代码中的任何位置使用此函数,链接器将在您尝试编译时抱怨,因为它无法找到定义。因此,您可以简单地添加无效的虚拟定义。

header.h

void myFunction();

source.cpp(1)

int main()
{
    myFunction(); // linker error on compile
    return 0;
}

source.cpp(2)

void myFunction() {}; // dummy definition

int main()
{
    myFunction(); // no problem
    return 0;
}

答案 2 :(得分:0)

好的,所以在得到你们的帮助并在网上搞清楚之后,我找到了一个适合我的解决方案。

我已经这样设置了:

主要代码:

void mouseClicked();

void main(){
    setMouseClicked(mouseClicked);
}

void mouseClicked();

标题代码:

void (*mc)() = NULL;
void setMouseClicked(void (*fun)(void)){
    mc = fun;
}

然后在事件函数中我这样做:

void handleMousePress(int button, int state, int x, int y){
    mouseX = x;
    mouseY = y;
    mouseButton = button;
    if(state == GLUT_DOWN){
        if(mc != NULL)
            (*mc)();
    }
}

我通过在代码的主要部分中声明函数并为该函数设置了一个setter来进行妥协,但是我已经添加了一个重命名函数的功能,这些函数在事件时被调用触发了。

再一次,感谢你的建议,但最后我发现功能指针效果最好。