Помимо добавления соединителя JDBC MySQL убедитесь, что context.xml (если он не распакован в папке webapps Tomcat) с вашими определениями соединений с БД включены в каталог Tomcats conf.
Для вызова функции членства указателем Вам нужны две вещи: указатель на объект и указатель на функцию. Вам нужны оба в 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;
}
Я настоятельно рекомендовал бы boost::bind
и boost::function
для чего-либо как это.
Видят Передача и называют функцию членства (повышение:: свяжите / повышение:: функция?)
Разве Вы не были бы лучше обслужены для использования стандартного 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.
В редком случае, который Вы, оказывается, разрабатываете с Разработчиком Borland C++ и не возражаете писать код, характерный для той среды разработки (то есть, код, который не будет работать с другими компиляторами C++), можно использовать __ ключевое слово закрытия. Я нашел маленькая статья о Разработчике C++ закрытия . Они предназначаются, прежде всего, для использования с Borland VCL.
Другие сказали Вам, как сделать это правильно. Но я удивлен, что никто не сказал Вам, что этот код на самом деле опасен:
this->ButtonFunc = &ButtonFunc;
, Так как ButtonFunc является параметром, он выйдет из объема, когда функция возвратится. Вы берете его адрес. Вы получите значение типа void (object::**ButtonFunc)()
( указатель на указатель на функцию членства ) и присвоите его этому-> ButtonFunc. В то время, когда Вы попытались бы использовать это-> ButtonFunc, Вы попытаетесь получить доступ к устройству хранения данных (теперь не существующий больше) локальный параметр, и Ваша программа, вероятно, отказала бы.
я соглашаюсь с решением Commodore. Но необходимо изменить его строку на
((ButtonObj)->*(ButtonFunc))();
, так как ButtonObj указатель для возражения.