2010-08-31 69 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替代原则。