2011-03-23 30 views
1

我非常困惑自己到了不歸路的地步,並且覺得我的項目太龐大,無法跟上我目前的方式。有很多GUI屏幕的程序的設計方法

簡而言之:

1)有許多圖形屏幕(窗口),每個屏幕在其自己的.cpp定義與所附的.h頭瓦特/公共&私有減速的類。

2)我正在使用FLTK GUI工具包,所以當我離開一個屏幕時,我會對其調用「hide()」,我假設它是垃圾收集,然後創建一個新的任何屏幕實例跟隨。我的問題是,如果一個屏幕(屏幕A可以調用它)創建另一個屏幕(屏幕B),那麼我必須在屏幕A中包含屏幕B的頭文件,並且在屏幕A中創建一個屏幕B的全局指針的.cpp。

即。屏幕A的一個僞編碼器

#include "screenb.h" 

ScreenB* screenb_ptr; // global 

... 
Bunch of Code, constructors, deconstructors, etc 
... 

void ScreenA::exit_and_make_screen_b() 
{ 
    ScreenA.hide(); 
    screenb_ptr = new ScreenB(); 
} 

這是最好的方法嗎?我覺得它很sl((還有一個內存泄漏?),我應該有一個類似於.cpp/.h的虛擬內存來跟蹤一堆extern-qualified指針;特別是因爲有時我必須返回/前進屏幕(即可以從其他多個屏幕跳回到主菜單屏幕)。任何建議表示讚賞!

回答

2

這裏有幾個建議:

  1. 創建所有屏幕包括一個新的頭文件。然後你可以包含這個頭文件並捕獲你所有的其他屏幕頭文件。
  2. 您可能會考慮一個屏幕管理器,它可以保留對屏幕的所有引用。屏幕之間的導航將留給您的屏幕管理員處理所有引用和指針。這樣你就不會把屏幕連接在一起,而是通過一個共同的媒介進行交流。

例如:

screenManager->NavigateScreen(SCREEN_USER_PROFILE); 

所有屏幕都可以從保存的指針屏幕經理(他們需要通過他們的構造函數或抓鬥從靜態單一實例)一個基類繼承。這樣,所有的屏幕都可以請求新的屏幕導航。

+0

好吧,我想這樣做

  • 逆天,但沒有C++版在一段時間。 (當我輸入時,似乎我的評論被提交!)。無論如何,我把所有的標題都移到了screenmanager.h的一個頭下,並且有一個screenmanager.cpp並創建了一個公共函數ScreenManager :: create(一些var,int x,int y,int l,int h,char * title)...我想要「一些var」部分來決定創建什麼屏幕,但不確定如何在沒有大的case語句的情況下去做。我無法從調用者傳遞對象,因爲它不知道它的存在,因爲它在screenmanager.h下抽象出來。想法? – jparanich 2011-03-23 16:58:42

  • +0

    哦,謝謝:) – jparanich 2011-03-23 17:13:50

    +0

    你可能會考慮讓somevar成爲枚舉。然後,您可以將枚舉值傳遞給構造函數(或導入函數)。窗口管理器內部的case語句可能是好的,因爲您已將您的屏幕抽象爲單個管理器。如果您需要*進一步抽象,可能會查看工廠設計模式。 – 2011-03-23 17:35:48

    1

    順便說一句:我不完全確定FLTK的內存結構。隱藏屏幕可能根本不會刪除內存,只是隱藏窗口的GUI表示,允許您稍後以相同的狀態再次打開它。

    GUI的一個好方法是模型 - 視圖 - 控制器體系結構,其中您有一個控制器來根據需要操作GUI。

    這將更多地體現出來:

    WindowManager wm; 
    
    void ScreenA::exit() 
    { 
         wm.registerExit(screenb_ptr); 
         wm.actOnExit(); 
    } 
    

    或者一些這樣類似的事情讓你的窗口的中心協調器。這允許:

    • 可插拔接口
    • 更好地組織對錯誤
    +0

    Upvote讓我想起MVC。我正在努力將你的sol'n和j0rd4n結合起來。謝謝。 – jparanich 2011-03-23 17:22:37