gpt4 book ai didi

qt - QObject 的空模式

转载 作者:行者123 更新时间:2023-12-04 13:12:24 32 4
gpt4 key购买 nike

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

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


让我们举个例子。我们有一个 worker 使用工具来完成工作:

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;
...

在这种情况下,工具是库的公共(public)域对象,由 worker 使用。我正在开发这样的图书馆。所以 worker 正在使用 Screwdriver ,但它坏了并被毁坏了。没问题:

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 上调用,它什么都不做,所以不需要检查指针是否为空。

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

最佳答案

我认为空对象模式对类值类最有意义。示例是 QString 或 QVariant,如果您不想使用 if ( str && !str->isEmpty() ) 之类的代码,而只是执行 if ( !str.isEmpty() )。对于不是值但具有“身份”的 QObject,我从未发现它有用。

关于qt - QObject 的空模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3607180/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com