设置两个函数相等

时间:2011-06-16 02:16:05

标签: c++ class function

我正在尝试创建一个C ++ Button类,用户在按下按钮时输入要执行的函数。到目前为止,这是我的代码:

class Button {
public:
    char* text;
    void* buttonclick();
    Button (char* constext, void* consbuttonclick()) {
        text = constext;
        //What do I do here?
    }

};

我试图让构造函数将consbuttonclick()的值传递给buttonclick()。我相信使用函数指针有一种方法可以做到这一点,但是我一直遇到麻烦,所以我非常感谢有关如何继续的一些帮助。

4 个答案:

答案 0 :(得分:2)

您声明的是返回void *的函数。你想要一个函数返回void的指针。首先,您需要更改原型:代替您想要的void * foo() void (*foo)()。 (你必须准确地理清你想要的东西,但这就是主意。)

一旦你拥有它,你只需使用函数调用操作符()来调用它,所以你会得到像

这样的东西
class Button {
public:
    char* text;
    void* buttonclick();
    Button (char* constext, void(* consbuttonclick())) {
        text = constext;
        consbuttonclick();
    }

};

但更好的是,创建所谓的仿函数类,如:

 class ClickFunctor {
    public:
    void doIt(){
      // code
    }
 }

然后传递一个ClickFunctor对象。

class Button {
  public:
  char* text;
  Button (char* constext, ClickFunctor cf) {
    text = constext;
    cf.doIt();
  }
};

现在,请阅读有关这些内容的C++ FAQ book。 (更新:Marshall称这些东西为“functionoids”而不是“functor”,只是为了警告你。)

答案 1 :(得分:0)

很抱歉破坏了你的泡沫,但没有理智的做法。仅存在函数名称以便于编写。一旦编译器获得它们,名称就会变成乱码,然后只变成函数地址。这些名称(至少在C ++中)在运行时没有意义。

你最好的选择是if / else语句的长链或者可能是将字符串映射到函数指针的字典。但是您必须手动设置该字典。

答案 2 :(得分:0)

看,如果你想在c ++ ms-dos窗口中创建一个按钮,除非你有一个我不喜欢的库,否则无法完成。但我找到了解决方法(这很长但完成工作)。我做的是我找到了一个按钮的左上角位置,简单的cout<<“whatevergoeshere”;和右下角。然后,通过创建一个在按下左键时返回true的函数,如果单击位于为左上角和右下角提供的参数内,则控件将继续。这是一个非常复杂的过程,但我可以给你我在另一个答案中使用的源代码。

(如果你不想解释这些代码,我会。直到最近我才知道如何做到这一点。但重要的是,每次都要将窗口保持在同一个位置。我正在使用的环境(代码::块),窗口停留在同一个地方,但移动它可能搞乱按钮。还记得连续使用系统(“cls”);清除屏幕所以东西没有不要改变位置。(系统“cls”位于cstdio或cstdlib库中。)

答案 3 :(得分:0)

以下是我使用的代码:

#include <iostream>
#include <windows.h>
#include <cstdlib>
#include <cstdio>
#include <stdio.h>

#ifndef MOUSE_HWHEELED
#define MOUSE_HWHEELED 0x0008
#endif
using namespace std;

int main()
{
POINT point;
HANDLE csbiHandle;
CONSOLE_SCREEN_BUFFER_INFO csbi;
int counter = 0;
DWORD cNumRead, i,fdwMode, fdwSaveOldMode;
INPUT_RECORD irInputBuffer[128];
HANDLE stdHandle;
stdHandle = GetStdHandle(STD_INPUT_HANDLE);
MOUSE_EVENT_RECORD mer;


cout << "|-------------|" << endl
     << "|      A      |" << endl
     << "|-------------|" << endl;
buttonpress:
ReadConsoleInput(stdHandle, irInputBuffer,128, &cNumRead);
GetCursorPos(&point);
for(i=0; i<cNumRead; i++)
{
    switch(irInputBuffer[i].EventType)
    {
        case MOUSE_EVENT:
        {
            mer = irInputBuffer[i].Event.MouseEvent;

            if(mer.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED)
            {
                cout << "left button press" << endl;
                cout << point.x << " " << point.y << endl;
                if(point.x>=16&&point.x<=182&&point.y>=30&&point.y<=63){cout << "You clicked A!!" << endl;}



            }
            else
            {
                goto buttonpress;
            }
            break;
       }
        default:{
            printf("unknown\n");
            break;}
    }
}
goto buttonpress;



return 0;
}