Clearing input when failed:
http://faq.cprogramming.com/cgi-bin/...&id=1043284392
I've never written C++ classes to support menus, but it shouldn't be hard to do. Perhaps something like this:
Code:
#include <iostream>
#include <string>
class menucontext {
public:
bool fquit;
menucontext() : fquit(false) { };
~menucontext() {};
};
typedef void (*menufunc)(menucontext &ctxt);
class menuitem {
private:
std::string descr;
char choice;
menufunc func;
public:
menuitem(const std::string &s, char c, menufunc f):
descr(s), choice(c), func(f)
{
};
~menuitem() {
};
void print() {
std::cout << choice << ": " << descr << std::endl;
};
void domenu(menucontext &ctxt) {
func(ctxt);
};
bool isChoice(char c) {
return (c == choice);
}
};
class menu {
private:
struct menunode {
menunode *next;
menuitem *item;
};
menunode *head;
menunode *tail;
public:
menu() : head(0), tail(0) {
}
~menu() {
menunode *p, *q;
for(p = head; p; p = q) {
q = p->next;
delete p->item;
delete p;
}
};
void addmenu(std::string s, char c, menufunc f) {
menunode *node = new menunode;
node->item = new menuitem(s, c, f);
node->next = 0;
if (!head)
head = tail = node;
else {
tail->next = node;
tail = node;
}
};
void choose(menucontext &ctxt) {
char c;
menunode *p;
bool choosen = false;
for(p = head; p; p = p->next) {
p->item->print();
}
do {
std::cin >> c;
for(p = head; p; p = p->next) {
if (p->item->isChoice(c)) {
p->item->domenu(ctxt);
choosen = true;
}
}
if (!choosen)
std::cout << "That wasn't a valid choice" << std::endl;
} while(!choosen);
};
};
void first(menucontext &ctxt)
{
std::cout << "In first" << std::endl;
}
void quit(menucontext &ctxt)
{
std::cout << "Quitting..." << std::endl;
ctxt.fquit = true;
}
int main() {
menu m;
menucontext ctxt;
m.addmenu("First menu", '1', first);
m.addmenu("QUit", 'q', quit);
while(!ctxt.fquit)
m.choose(ctxt);
return 0;
}
[That got a lot longer than I expected.]
--
Mats