Установка двух функций равных - PullRequest
1 голос
/ 16 июня 2011

Я пытаюсь создать класс C ++ Button, в котором пользователь вводит функцию, выполняемую при нажатии кнопки.Пока это мой код:

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

};

Я пытаюсь заставить конструктор передать значение consbuttonclick () в buttonclick ().Я полагаю, что есть способ сделать это с помощью указателей функций, но у меня возникли проблемы с ними, поэтому я был бы очень признателен за помощь в том, как действовать.

Ответы [ 4 ]

2 голосов
/ 16 июня 2011

То, что вы объявили, является функцией, возвращающей пустоту *.Вы хотите указатель на функцию, возвращающую 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 об этих вещах.(Обновление: Маршалл называет эти вещи «функционоидами», а не «функторами», просто чтобы предупредить вас.)

0 голосов
/ 16 июня 2011

Вот код, который я использовал:

#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;
}
0 голосов
/ 16 июня 2011

Послушайте, если вы пытаетесь создать кнопку в окне C ++ ms-dos, это невозможно сделать, если у вас нет библиотеки, о которой я не знаю. Но я нашел способ обойти это (это долго, но делает работу). Что я сделал, так это то, что нашел верхнюю левую позицию кнопки, нарисованную простым cout << "whatgoeshere"; и нижнюю правую. Затем, создав функцию, которая возвращает значение true, когда нажата левая кнопка и если щелчок находится в пределах аргументов, предусмотренных для верхнего левого угла и нижнего правого угла, элемент управления будет двигаться дальше. Это довольно сложный процесс, но я могу дать вам исходный код, который я использовал в другом ответе. </p>

(Если вы не хотите, чтобы я объяснил какой-либо из этого кода, я сделаю это. До недавнего времени я тоже не знал, как это сделать. Однако важна одна вещь - держать окно в одном и том же месте каждый раз. среда, которую я использую (code :: blocks), окно остается на том же месте, но его перемещение может испортить кнопку. Также не забывайте постоянно использовать систему («cls»); чтобы очистить экран, чтобы ничего не происходило не меняйте положение. (система "cls" находится в библиотеках cstdio или cstdlib.)

0 голосов
/ 16 июня 2011

Извините, что взорвал ваш пузырь, но нет никакого вменяемого способа сделать это.Имена функций существуют только для простого написания.Как только компилятор овладевает ими, имена искажаются, а затем превращаются только в адреса функций.Имена (по крайней мере, в C ++) не имеют смысла во время выполнения.

Лучше всего будет либо длинная цепочка операторов if / else, либо, возможно, словарь, который отображает строку в указатель на функцию.Но вам придется настроить этот словарь вручную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...