我有麻煩選擇我的問題的最佳解決方案。目前,我正在開發我的第一個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;
};
謝謝。 非常感謝您的幫助。
你的例子是缺少指針(聲明中的'*'是指針)。 btw qt應用程序擁有自己的內存管理 –
一般來說,智能指針很好,請參閱[RAII]的相關描述(http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization)。 –
使用智能指針表示所有權。原始指針意味着所有權在其他地方管理。你幾乎不應該使用delete關鍵字。 –