2010-08-31 67 views
3

(C++/Qt)我有一個指向QObject的智能指針。讓我們說一個QWeakPointer。對於某些外部原因(可能發生在另一個對象或事件中的事情),可能會損壞指向的對象。因爲我有一個智能指針,所以沒有懸掛參考,所以沒有問題。但我總是必須檢查指針是否爲空。與QObject的空模式

我想使用空模式,以避免檢查這一切,但我不知道這是可能的或方便與QObject。這個想法是,指針指向對象,並在它被破壞的情況下,智能指針將其指向的對象改爲空對象。這是一個好主意,還是應該忘記它,並且檢查指針是否始終爲空?


讓我們來看一個例子。我們誰使用的工具來完成工作工人:

class Worker : public QObject 
{ 
    Q_OBJECT 

public: 
    Worker(QObject *parent = 0); 
    void work() 
    { 
     if(m_tool) 
      m_tool->use(); 
     emit workCompleted(); 
    }; 

signals: 
    workCompleted(); 

public slots: 
    void setTool(QWeakPointer<Tool> tool); 

private: 
    QWeakPointer<Tool> m_tool; 
}; 


class Tool : public QObject 
{ 
    Q_OBJECT 

public: 
    Tool(); 

public slots: 
    void use() =0; 
}; 


class Screwdriver : public Tool 
{ 
    Q_OBJECT 

public: 
    Screwdriver() : Tool(); 

public slots: 
    void use() 
    { 
     // do something 
    }; 
}; 


class Hammer : public Tool; 
class Saw : public Tool; 
... 

在這種情況下,該工具是一個庫,用於由工人的公共域中的對象。我正在開發這樣的圖書館。所以這名工作人員正在使用螺絲刀,但它被破壞並被毀壞。沒問題:

if(m_tool) 
    m_tool->use(); 
emit workCompleted(); 

m_tool是0,所以它什麼都不做。但是我們必須檢查它是否每次都不爲空。

現在讓我們說我們有一個NullTool對象:

class NullTool : public Tool 
{ 
    Q_OBJECT 

public: 
    NullTool() : Tool(); 

public slots: 
    void use() 
    { 
     // does nothing 
    }; 
}; 

當工具被破壞,我們的指針將是聰明,會知道它應該指向NullTool實例。所以工人::工作()可以實現這樣的:

void Worker::work() 
{ 
    m_tool->use(); 
    emit workCompleted(); 
}; 

m_tool->使用()然後被調用上什麼也不做NullTool,所以就沒有必要檢查指針不爲空。

這是個好主意嗎? Qt提供的智能指針類可能還是應該繼承QWeakPointer?

+0

我看不出有關檢查'm_tool'是否爲空的任何問題。你關心什麼? – tibur 2010-08-31 10:25:01

回答

0

我不明白,清楚你的使用情況,但是當對象已經由QObject的連接下面的信號摧毀你的程序可以發出信號:

void destroyed (QObject * obj = 0); 
3

我認爲空對象模式最有意義對於價值類的課程。例如QString或QVariant,如果你不想像if(str & &!str-> isEmpty())這樣的代碼,但是如果(!str.isEmpty())就這麼做。對於不是價值觀但具有「身份」的QObject,我從來沒有發現它有用。

0

我的主意沒有看到任何問題。您只需比較實現它的工作與每次檢查指針的工作。讓我們檢查指針10.000次,這是一個好主意,使用你的方法。 附註:您的空對象模式依賴於Tool::use()無任何副作用的事實。

小心Tool::use()的可能的副作用不會妨礙您用NullTool::use()多態性替換它。換句話說:確保你不打破Liskov替代原則。