C++ Создание глобальной ссылки на объект
Я пытаюсь создать глобальную ссылку на объект, но кажется, что он не работает, или я получаю другую ошибку в Qt C++.
У меня есть класс под названием "Система", который содержит много объектов в качестве членов. Я хочу получить доступ к участникам Системы, где бы они ни находились. Вот мой код ниже:
// System.h
class System
{
public:
Obj1* m_obj1;
Obj2* m_obj2;
System();
~System();
static System* GetGlobalReference();
}
// System.cpp
static System* GlobalReference = 0;
System::System()
{
if (!GlobalReference) GlobalReference = this;
m_obj1 = new Obj1();
m_obj2 = new Obj2();
}
System* System::GetGlobalReference()
{
return GlobalReference;
}
// main.cpp
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
System* system = new System();
MainWindow window;
window.showMaximized();
return app.exec();
}
//Obj1.h
class Obj1 : public QObject
{
Q_OBJECT
public:
Obj1() : QObject() {}
~Obj1();
public slots:
void Import();
}
// Obj1.cpp
void Obj1::Import()
{
QString path = QFileDialog::getOpenFileName(
0,
QString("Import file..."),
QString("C:\\"),
QString("JPEG File (*.jpg)"),
0,
0);
if (System::GetGlobalReference())
System::GetGlobalReference()->m_obj2->Import(path); // error here
else
// System::GlobalReference is null
}
Кажется, ссылка не нулевая, но я получаю сообщение об ошибке во время выполнения "Место чтения нарушения доступа..." Что не так?
Кстати, Obj1 - это QObject, а метод Import - публичный слот. Может ли ошибка быть связана с этим?
Изменить: последний шаг отладчика находится здесь в QGenericAtomic.h
T load(const T &_q_value) Q_DECL_NOTHROW
{
return _q_value; // -> Debugger stops here
}
Edit2: я использовал шаблон Singleton, как говорится в ответах, но моя проблема все еще продолжается.
System::GetInstance()->GetObj1()->Import(path); // after this line
в "_q_value" написано ""
3 ответа
Я решил свою проблему. Проблема была вызвана методом Obj1->Import, но во время отладки в qt отладчик не обращается внутрь метода, когда я нажимаю F11(Step Into). Я не могу понять, почему?
Если вы хотите только один экземпляр вашего System
класс, вы должны использовать шаблон Singleton.
Но шаблон Singleton следует использовать, когда вам нужен уникальный экземпляр класса, причина не в том, чтобы иметь глобальный объект. Даже если использовать этот шаблон, ваш экземпляр доступен отовсюду.
Посмотрите на эту статью о шаблонах проектирования Singleton, это может быть полезно в вашем случае.
Кроме того, в C++ объявление глобальной переменной выполняется с extern
не static
,