Problem with functions!

Started by
9 comments, last by rip-off 11 years, 9 months ago
I would like to create buttons. And when you click them, do some functions.
But i have problem with button actions sad.png.

Some of my code:


//---- Header File----
class Button{
public:
//variables initiating like float x,y,z...
void func(void);
void draw(){
//Some drawing
}
void CheckButtonClick(float mx, float my,int key,int state){
if(mx >= x && mx <= x+w &&
my >= y && my <= y+h &&
state == 0 && key == 0){
click = true;
func();
}else
click = false;
}
};

//----Main File----

void AddButton(Button &button,string text,void func(),float x,float y,float z,float w,float h,float s,float r,float g,float b,GLuint tex,GLuint clicktex){
button.tex = tex;
button.clicktex = clicktex;
button.func() = func();
button.textsize = s;
button.text = text;
button.x = x;
button.y = y;
button.z = z;
button.w = w;
button.h = h;
button.color[0] = r;
button.color[1] = g;
button.color[2] = b;
}


Button button_file,

void close(){
exit(0);
}


void InitRendering(){

_buttondark = loadTexture ("Data/IvoGui/buttondark.tga");
_buttondark_click = loadTexture ("Data/IvoGui/buttondark_click.tga");

AddButton(button_help,"Pomoc",close(),133,5,0.001f,64,16,0.9f,1.0f,1.0f,1.0f,_buttondark,_buttondark_click);
}


It gives me an error:

invalid use of void expression


Without button actions everything works fine.
Can you help me with this actions?

Thanks in advance.
Advertisement
Button button_file,

I think you mistyped a semicolon here, but I'm pretty sure it's a copy/paste mistake. This is followed by a "void", which explains the error message (C++ compiler errors generally make no sense if you made a typo, so you have to look through to try and find it), but I doubt this is the source of the error, could you post the revised code if this is so?

“If I understand the standard right it is legal and safe to do this but the resulting value could be anything.”



Button button_file,


I think you mistyped a semicolon here, but I'm pretty sure it's a copy/paste mistake. This is followed by a "void", which explains the error message (C++ compiler errors generally make no sense if you made a typo, so you have to look through to try and find it), but I doubt this is the source of the error, could you post the revised code if this is so?
[/quote]

"Button button_file," was a copy/paste mistake smile.png. But if you want i can give you code that is needed (some of header file, some of main that is about button), or a full code for a further investigation.
This is not legal:

button.func() = func();

You cannot assign to a function. In your current code, you would have to create a concrete implementation of Button::func.

If you have a newish compiler you can handle this using std::function. If you are using an older compiler and cannot upgrade, boost::function is an option. You could also fall back to function pointers for simple functions, and a pure virtual interface class for more complex scenarios.
What you mean by concrete implementation of Button::func.
You have declared a function. C++ requires this function to have a single definition.

You appear to want to design a callback system, where you can given different Buttons different functions to call when they are clicked. C++ doesn't have "first class" support for this at the language level, but it can be simulated using the approaches I've outlined.
Please proceed, and write modified piece of code.
I gave you lots of starting points. What have you tried?

Please proceed, and write modified piece of code.


function pointers: http://www.cprogramm...n-pointers.html (C way of doing it, only use this if the other two options are unsuitable for you)
std::function: http://en.cppreferen...tional/function (Use this if your compiler is modern enough)
boost::function: http://www.boost.org....html#id1545628
[size="1"]I don't suffer from insanity, I'm enjoying every minute of it.
The voices in my head may not be real, but they have some good ideas!
Thanks to everyone, but i figured it out for myself smile.png.

This topic is closed to new replies.

Advertisement