Как Вы передаете указатель функции членства?

Помимо добавления соединителя JDBC MySQL убедитесь, что context.xml (если он не распакован в папке webapps Tomcat) с вашими определениями соединений с БД включены в каталог Tomcats conf.

27
задан Carl Seleborg 24 October 2009 в 12:58
поделиться

5 ответов

Для вызова функции членства указателем Вам нужны две вещи: указатель на объект и указатель на функцию. Вам нужны оба в MenuButton::SetButton()

template <class object>
void MenuButton::SetButton(int xPos, int yPos, LPCWSTR normalFilePath,
        LPCWSTR hoverFilePath, LPCWSTR pressedFilePath,
        int Width, int Height, object *ButtonObj, void (object::*ButtonFunc)())
{
  BUTTON::SetButton(xPos, yPos, normalFilePath, hoverFilePath, pressedFilePath, Width, Height);

  this->ButtonObj = ButtonObj;
  this->ButtonFunc = ButtonFunc;
}

Тогда, можно вызвать функцию с помощью обоих указателей:

((ButtonObj)->*(ButtonFunc))();

не забывают передавать указатель на Ваш объект к MenuButton::SetButton():

testMenu::testMenu()
  :MenuScreen("testMenu")
{
  x.SetButton(100,100,TEXT("buttonNormal.png"), TEXT("buttonHover.png"),
        TEXT("buttonPressed.png"), 100, 40, this, test2);
  draw = false;
}
33
ответ дан mabraham 28 November 2019 в 04:43
поделиться

Я настоятельно рекомендовал бы boost::bind и boost::function для чего-либо как это.

Видят Передача и называют функцию членства (повышение:: свяжите / повышение:: функция?)

15
ответ дан Community 28 November 2019 в 04:43
поделиться

Разве Вы не были бы лучше обслужены для использования стандартного OO. Определите контракт (виртуальный класс) и реализация, что в Вашем собственном классе, тогда просто передайте ссылку на свой собственный класс и позвольте получателю вызвать функцию контракта.

Используя Ваш пример (я переименовал 'test2' метод к 'buttonAction'):

class ButtonContract
{
  public:
    virtual void buttonAction();
}


class testMenu : public MenuScreen, public virtual ButtonContract
{
  public:
    bool draw;
    MenuButton<testMenu> x;

    testMenu():MenuScreen("testMenu")
    {
      x.SetButton(100,100,TEXT("buttonNormal.png"), 
              TEXT("buttonHover.png"), 
              TEXT("buttonPressed.png"), 
              100, 40, &this);
      draw = false;
    }

    //Implementation of the ButtonContract method!
    void buttonAction()
    {
      draw = true;
    }
};

В методе получателя, Вы храните ссылку на ButtonContract, тогда когда Вы хотите выполнить, действие кнопки просто звонят, 'buttonAction' метод этого хранил объект ButtonContract.

5
ответ дан GKelly 28 November 2019 в 04:43
поделиться

В редком случае, который Вы, оказывается, разрабатываете с Разработчиком Borland C++ и не возражаете писать код, характерный для той среды разработки (то есть, код, который не будет работать с другими компиляторами C++), можно использовать __ ключевое слово закрытия. Я нашел маленькая статья о Разработчике C++ закрытия . Они предназначаются, прежде всего, для использования с Borland VCL.

2
ответ дан Parappa 28 November 2019 в 04:43
поделиться

Другие сказали Вам, как сделать это правильно. Но я удивлен, что никто не сказал Вам, что этот код на самом деле опасен:

this->ButtonFunc = &ButtonFunc;

, Так как ButtonFunc является параметром, он выйдет из объема, когда функция возвратится. Вы берете его адрес. Вы получите значение типа void (object::**ButtonFunc)() ( указатель на указатель на функцию членства ) и присвоите его этому-> ButtonFunc. В то время, когда Вы попытались бы использовать это-> ButtonFunc, Вы попытаетесь получить доступ к устройству хранения данных (теперь не существующий больше) локальный параметр, и Ваша программа, вероятно, отказала бы.

я соглашаюсь с решением Commodore. Но необходимо изменить его строку на

((ButtonObj)->*(ButtonFunc))();

, так как ButtonObj указатель для возражения.

2
ответ дан Johannes Schaub - litb 28 November 2019 в 04:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: