(C++/Qt)我有一个指向QObject的智能指针。假设是一个QWeakPointer。由于某些外部原因(可能发生在另一个对象中或由于一个事件而发生的事情),指定对象可能被销毁。因为我有一个智能指针,所以不会有悬空引用,所以没有问题。但我总是必须检查指针是否为空。
我正在考虑使用空模式,以避免一直检查它,但我不确定这在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实例。所以Worker::work()可以这样实现:
void Worker::work()
{
m_tool->use();
emit workCompleted();
};然后,m_tool->use()将在NullTool上被调用,这样就不需要检查指针是否为null。
这是个好主意吗是否可以使用Qt提供的智能指针类,或者应该使用QWeakPointer子类?
发布于 2010-08-31 09:29:52
我认为空对象模式对于类似值的类来说是最有意义的。例如QString或QVariant,如果您不想拥有if ( str & !str->isEmpty() )之类的代码,那么只需执行if ( !str.isEmpty() )即可。对于QObjects,它不是值,而是具有“身份”,我从来没有发现这是有用的。
发布于 2010-09-05 03:55:39
我看不出你的想法有什么问题。您只需将实现它所需的工作与每次检查指针的工作进行比较。让我们检查指针10.000次--使用您的方法是个好主意。附带注意:您的空对象模式依赖于这样一个事实,即Tool::use()没有任何副作用。
注意,当您用Tool::use()替换它时,不要妨碍它在NullTool::use()中可能产生的副作用。换句话说:确保您没有破坏Liskov替换原则。
https://stackoverflow.com/questions/3607180
复制相似问题