I'm trying to implement a GUI management system in a project I'm working
on. The setup is like this:
base_gui_object:
- all gui elements are derived from this class, which includes a virtual
draw() function to override
window:
- derived from base_gui_object, overrides the draw() function.
gui_controller:
- contains linked list (subscriber_list) of all gui elements in use
subscriber_list:
- contains linked list of all elements (subscriber_info)
subscriber_info:
- contains a pointer to a single gui element (base_gui_object)
Now, here's the important code:
/////////////////////////////////////////////////////
class base_gui_object
{
public:
virtual void draw() = 0;
};
class subscriber_info
{
public:
int priority;
base_gui_object *gui_item;
public:
subscriber_info() {}
subscriber_info(base_gui_object *item,int priority);
subscriber_info *next;
int get_priority() { return priority; }
void *get_gui_subscriber() { return gui_item; }
};
class subscriber_list
{
private:
int num_subscribers;
subscriber_info *entries;
int index;
public:
subscriber_list() { index = 0; num_subscribers = 0; }
~subscriber_list();
void add(base_gui_object *item,int priority);
void remove(base_gui_object *item);
int get_num_subscribers() { return num_subscribers; }
subscriber_info *traverse();
subscriber_info *first() { return entries; }
subscriber_info *next();
subscriber_info *prev();
};
class gui_control
{
private:
subscriber_list subscribers;
public:
gui_control() {}
void update();
void subscribe(base_gui_object *item,int priority);
void unsubscribe(base_gui_object *item);
//void translate_message();
};
class window : public base_gui_object
{
private:
char *title;
int x,y,w,h;
vid_info *vid;
game_info *game;
char *t;
public:
window(char *name,char *text,int x,int y,int w,int h,vid_info
*vid,game_info *game);
void draw();
void draw_text();
};
//////////////////////////////////////////////////////////////////////////////////////////////
// class Subscriber_Info - linked list items
subscriber_info::subscriber_info(base_gui_object *item,int priority)
{
gui_item = item;
next = NULL;
}
subscriber_info *subscriber_list::traverse()
{
subscriber_info *p = entries;
while(p->next) p = p->next;
return p;
}
//////////////////////////////////////////////////////////////////////////////////////////////
// class Subscriber_List - linked list
void subscriber_list::add(base_gui_object *item,int priority)
{
if(!entries)
{
entries = new subscriber_info(item,priority);
entries->next = NULL;
}
else
{
subscriber_info *p = traverse();
p->next = new subscriber_info(item,priority);
}
num_subscribers++;
}
//////////////////////////////////////////////////////////////////////////////////////////////
// class Gui_Control
void gui_control::subscribe(base_gui_object *item,int priority)
{
subscribers.add(item,priority);
}
void gui_control::unsubscribe(base_gui_object *item)
{
subscribers.remove(item);
}
void gui_control::update()
{
subscriber_info *p = subscribers.first();
while((p=subscribers.next())) p->gui_item->draw();
}
//////////////////////////////////////////////////////////////////////////////////////////////
// class Window
window::window(char *name,char *text,int x2,int y2,int w2,int h2,vid_info
*video,game_info *g)
{
title = name;
x = x2; y = y2;
w = w2; h = h2;
vid = video;
game = g;
t = text;
//draw();
//do some gui attaching stuff
}
/////////////////////////////////////////////////////////////////////////////////////////
In main(), this is the testing code.
char *text = {
"This is a test\n"
"of multiple line stuff"
};
window *win = new window("Char Editor",text,5,3,20,5,vid,game);
gui_control *gui = new gui_control();
gui->subscribe(win,PRIORITY_LOW);
/////////////////////////////////////////////////////////////////////////////////////////
Now, the problem code is the single line "while((p=subscribers.next()))
p->gui_item->draw();" in gui_controller::update(). Whenever I try to call
the draw() function directly, I get an access violation error. This is my
first time trying limited object-oriented programming like this, so I'd
appreciate learning how I'm supposed to access virtual member functions
like this.
Thanks.
|