首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带QObject的空模式

带QObject的空模式
EN

Stack Overflow用户
提问于 2010-08-31 08:08:37
回答 2查看 4.5K关注 0票数 3

(C++/Qt)我有一个指向QObject的智能指针。假设是一个QWeakPointer。由于某些外部原因(可能发生在另一个对象中或由于一个事件而发生的事情),指定对象可能被销毁。因为我有一个智能指针,所以不会有悬空引用,所以没有问题。但我总是必须检查指针是否为空。

我正在考虑使用空模式,以避免一直检查它,但我不确定这在QObject中是否可行或方便。这样做的想法是指针指向对象,如果被破坏,智能指针会将其指向的对象更改为空对象。这是一个好主意,还是我应该忘记它,检查指针是否一直为空?

让我们给你举个例子。我们有一个工人用工具做它的工作:

代码语言:javascript
复制
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;
...

在这种情况下,该工具是库的公共域对象,由工作人员使用。我正在开发这样的图书馆。所以工人用的是螺丝刀,但是螺丝刀坏了,被毁了。没问题:

代码语言:javascript
复制
if(m_tool)
    m_tool->use();
emit workCompleted();

m_tool是0,所以它什么也不做。但我们每次都要检查它是否为空。

现在假设我们有一个NullTool对象:

代码语言:javascript
复制
class NullTool : public Tool
{
    Q_OBJECT

public:
    NullTool() : Tool();

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

当工具被销毁时,我们的指针将是智能的,并且知道它应该指向一个NullTool实例。所以Worker::work()可以这样实现:

代码语言:javascript
复制
void Worker::work()
{
    m_tool->use();
    emit workCompleted();
};

然后,m_tool->use()将在NullTool上被调用,这样就不需要检查指针是否为null。

这是个好主意吗是否可以使用Qt提供的智能指针类,或者应该使用QWeakPointer子类?

EN

回答 2

Stack Overflow用户

发布于 2010-08-31 09:29:52

我认为空对象模式对于类似值的类来说是最有意义的。例如QString或QVariant,如果您不想拥有if ( str & !str->isEmpty() )之类的代码,那么只需执行if ( !str.isEmpty() )即可。对于QObjects,它不是值,而是具有“身份”,我从来没有发现这是有用的。

票数 3
EN

Stack Overflow用户

发布于 2010-09-05 03:55:39

我看不出你的想法有什么问题。您只需将实现它所需的工作与每次检查指针的工作进行比较。让我们检查指针10.000次--使用您的方法是个好主意。附带注意:您的空对象模式依赖于这样一个事实,即Tool::use()没有任何副作用。

注意,当您用Tool::use()替换它时,不要妨碍它在NullTool::use()中可能产生的副作用。换句话说:确保您没有破坏Liskov替换原则。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3607180

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档