(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