qt — 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» написано «»

2

Решение

Если вы хотите иметь глобальные переменные, я бы рекомендовал использовать одиночка вместо.

Глобальные переменные в C ++ объявляются с использованием externне статично. Увидеть ссылка для дополнительной информации.

2

Другие решения

Если вы хотите только один экземпляр вашего System учебный класс, Вы должны использовать Синглтон.

Но шаблон Singleton следует использовать, когда вам нужен уникальный экземпляр класса, причина не в том, чтобы иметь глобальный объект. Даже если использовать этот шаблон, ваш экземпляр доступен отовсюду.

смотреть на Эта статья о шаблоне проектирования Singleton, это может быть полезно в вашем случае.

Кроме того, в C ++ объявление глобальной переменной выполняется с externне static,

2

Я решил свою проблему. Проблема была вызвана методом Obj1-> Import, но во время отладки в qt отладчик не обращается внутрь метода, когда я нажимаю F11 (Step Into). Я не могу понять, почему?

-1
По вопросам рекламы [email protected]