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