Hello everyone!
I am trying to make a custom class call certain functions in testApp… For example, I have a function in testApp called toggleBackground and I execute it with
((testApp*)ofGetAppPtr())->toggleBackground();
This works perfectly. Now I would like to make it dynamic and have the function name in a variable… something like…
var functionName;
((testApp*)ofGetAppPtr())->functionName();
Does anyone know how I can set the function name variable (currently using a string which I am guessing is wrong) and then call it?
Thank you so much.
Ahbee
May 25, 2014, 5:51am
2
Can you give more context about what you want to do. In c++ you cant call functions with strings. But what your trying to do might be accomplished with functions pointers
Hi Ahbee,
Thanks for getting back to me… I am making a simple button class…
In testApp I am calling my class successfully with
void testApp::draw(){
homeButton.makeSimpleButton(30, 660, 200, 60, 30, 120, 189, 190, "buttonimg.png", "toggleBackground()");
}
See the toggleBackground() at the end? I would like to be able to make that dynamic so each instance can have it’s own callback function.
My button class:
class ofxSimpleButton{
public:
float buttonX;
float buttonY;
float buttonW;
float buttonH;
int buttonR;
int buttonG;
int buttonB;
int buttonA;
string callbackfunc;
ofImage buttonImg;
//--------------------------------------------------------------
void makeSimpleButton(float _x, float _y, float _w, float _h, int _r, int _g, int _b, int _a, string imgpath, string callback){
buttonX = _x;
buttonY = _y;
buttonW = _w;
buttonH = _h;
buttonR = _r;
buttonG = _g;
buttonB = _b;
buttonA = _a;
callbackfunc = callback;
if(buttonR != -1.0 && imgpath == ""){
ofSetColor(buttonR, buttonG, buttonB, buttonA);
ofRect( _x, _y, _w, _h);
}else if(imgpath != ""){
//cout << "loadimage" << endl;
buttonImg.loadImage(imgpath);
buttonImg.draw(buttonX, buttonY);
}
}
//--------------------------------------------------------------
void pressSimpleButton(){
int mousex = ((testApp*)ofGetAppPtr())->mouseX;
int mousey = ((testApp*)ofGetAppPtr())->mouseY;
if(mousex > buttonX && mousex < buttonX+buttonW && mousey > buttonY && mousey < buttonY+buttonH){
cout << callbackfunc.c_str() << endl;
//WOULD LIKE TO MAKE THIS CALL DYNAMIC
((testApp*)ofGetAppPtr())->toggleBackground();
}
}
};
Ahbee
May 25, 2014, 6:39am
4
You can use function pointers. In newer openframeworks, testApp becomes ofApp
class ofApp;
class SimpleButton {
public:
void (ofApp::*callback)(void);
void makeButton(void (ofApp::*userCallback)(void)){
callback = userCallback;
}
void pressButton(){
((ofApp*)ofGetAppPtr()->*callback)();
}
};
buttonCallback is a user defined function
void ofApp::setup(){
button.makeButton(&ofApp::buttonCallback);
}
YES!!! This works perfectly. I have also changed testApp to ofApp. Cheers.