(C++/Qt) У меня есть умный указатель на QObject. Скажем, QWeakPointer. По какой-то внешней причине (что-то, что может произойти в другом объекте или из-за события) возможно, что указанный объект будет уничтожен. Поскольку у меня есть умный указатель, не будет оборванной ссылки, так что проблем нет. Но мне всегда нужно проверять, является ли указатель нулевым или нет.
Я думаю об использовании нулевого шаблона, чтобы не проверять это все время, но я не уверен, возможно ли это или удобно с QObject. Идея заключалась бы в том, что указатель указывает на объект, и в случае его уничтожения интеллектуальный указатель меняет свой указанный объект на нулевой объект. Это хорошая идея или я должен забыть об этом и просто проверять, всегда ли указатель равен NULL?
Давайте покажем вам пример. У нас есть рабочий, который использует инструмент для выполнения своей работы:
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, поэтому он просто ничего не делает. Но мы должны каждый раз проверять, что это не null.
Теперь предположим, что у нас есть объект 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?
m_tool
нулевым. Что вас беспокоит? - person tibur   schedule 31.08.2010