Используя C ++, у меня есть текстовый режим и режим GUI, реализованный с использованием FLTK, выбранный параметром командной строки, и я вижу много избыточности в кодах, за исключением дополнительного параметра в случае GUI, который мне нужно передать в основной виджет окна Мне интересно, есть ли способы убрать избыточность? Может быть, у меня возникли проблемы с дизайном? Буду признателен за помощь, и, пожалуйста, дайте мне знать, если нужна дополнительная информация. Я подумал об использовании необязательного параметра, но не могу получить нулевую ссылку.
Вот скелет кодов, которые действительно похожи (не точно, но должны быть достаточно близко, чтобы увидеть общую структуру). Может быть еще несколько циклов или функций if / else, вложенных до того, как у меня будет один другой вызов с дополнительным параметром Window &, но это в основном структура, которая на самом деле продолжается на несколько уровней вниз.
Спасибо за любую помощь!
int Game::init(){
if (graphics){
std::unique_ptr<Window> window = std::unique_ptr<Window>(new Window(...))
return Fl::run();
} else {
play_game();
return 0;
}
}
void Window::init(Fl_Widget* w, void *uData){
Window* window = (Window*) uData;
Window->game.play_game(window);
//Window has a private game& that is constructed to be equal to the game above.
}
void Game::play_game(){
while(!over()){
foo();
bar();
}
}
void Game::play_game(Window& window){
while(!over()){
foo();
bar(window);
}
}
void Game::bar(){
if(!a()){
b();
} else {
c();
}
}
void Game::bar(Window& window){
if(!a()){
b();
} else {
c(window);
window.redraw();
}
}
Аналогичный, но другой вопрос касается того, как я имею дело со статической функцией в FLTK, у меня где-то есть похожий код, подобный этому:
void Game::c(){
if(check_this()){
do_this();
}
}
void Game::c(Window& window){
Fl::run();
}
static void Window::call_back(Fl_Widget* w, void* uData){
Window* window = (Window *) uData;
if(window->game.check_this()){
window->do_this();
}
}