2011-11-06 173 views
2

我有麻煩選擇我的問題的最佳解決方案。目前,我正在開發我的第一個C++項目,我正在使用Qt BTW,但是因爲我是.NET開發人員,所以有些東西讓我對C++有點了解:)。大家知道,在一個收集世界的Java或.NET中,最好的做法是使用依賴注入來實現鬆耦合類,使其更具可測試性和可維護性,但我不知道在C++中該做什麼。 C++沒有GC,所以我們應該關心每個內存分配,並且會導致太多問題。C++組合最佳實踐

例如,我有一個類「規則」,其中有一個成員字段指向「應用程序」類:

class Rule : public QObject 
{ 
public: 
    explicit Rule(QObject *parent = 0); 

    unsigned int id(); 
    void setId(unsigned int id); 

    Application* application(); 
    void setApplication(Application* application) 
    { 
     m_Application = application 
     m_Application->setParent(this); 
    } 

}; 

在構造函數中,我指定NULL應用實例變量。在setApplication中,我將它作爲應用程序的父對象。由於Qt,Rule(父級)被銷燬時,應用程序實例會自動刪除。這是一個好方法嗎?如果我使用QSharedPointer等智能指針代替Application *,會更好嗎?什麼是你的經驗,什麼是缺點,什麼是最好的方法。我很樂意聽你的建議。此外還有一個棘手的部分。如果我將該課程授予團隊中的其他開發人員,或者我出版了該庫,該怎麼辦?開發人員可以輕鬆地編寫類似:

Application app; 
app.setId(1); 
Rule rule; 
rule.setApplication(&app); //When rule will be destroyed, the program would crash because app is allocated on the stack. 

Application *app = new Application(); 
app->setId(20); 
Rule *rule = new Rule(); 
rule->setApplication(app); 
Application *appToAnotherLocation = new Application(); 
rule->setApplication(appToAnotherLocation); // This wouldn't result in memory leak, because app is already child of rule, but if I didn't used Qt this would be a problem... probably :) 

現在來談談智能指針?是否有一些規則,什麼時候應該使用它們,什麼時候不應該使用它們?我有一個IRepository接口,它總是返回QSharedObject而不是指針。這是一個好方法,還是我過度使用它?

class IRepository 
{ 
public: 
    virtual bool save(Application & application) = 0; 
    virtual bool save(Rule & rule) = 0; 
    virtual bool save(History & history) = 0; 

    virtual bool remove(Application & application) = 0; 
    virtual bool remove(Rule & rule) = 0; 
    virtual bool remove(History & history) = 0; 

    virtual QSharedPointer<Application> getApplication(unsigned int id) = 0; 

    virtual QSharedPointer<Rule> getRule(unsigned int id) = 0; 
    virtual QList< QSharedPointer<Rule> > getRules(unsigned int applicationId) = 0; 

    virtual QSharedPointer<History> getHistory(unsigned int id) = 0; 
    virtual QList< QSharedPointer<History> > getHistories(unsigned int applicationId) = 0; 
    virtual QList< QSharedPointer<History> > getHistories(unsigned int applicationId, QDateTime dateFrom, QDateTime dateTo) = 0; 
}; 

謝謝。 非常感謝您的幫助。

+0

你的例子是缺少指針(聲明中的'*'是指針)。 btw qt應用程序擁有自己的內存管理 –

+1

一般來說,智能指針很好,請參閱[RAII]的相關描述(http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization)。 –

+1

使用智能指針表示所有權。原始指針意味着所有權在其他地方管理。你幾乎不應該使用delete關鍵字。 –

回答

1

主觀意見;

第一:就像克里斯說的,智能指針是內存泄漏的一個很好的選擇。儘量使用它們。

第二:一個好的設計方法是隻刪除創建者中的指針。我的意思是,一個班級創建並破壞他們的指針。不要刪除其他類中的指針,這將允許您擁有更清晰,可讀和可維護的代碼。

在您的示例中,Rule'must'不會刪除應用程序指針。想想你的設計:我不明白爲什麼規則是應用程序的父項。我想應用程序可以處理很多規則。