Я пытаюсь создать глобальную ссылку на объект, но кажется, что он не работает, или я получаю другую ошибку в 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» написано «»
Если вы хотите иметь глобальные переменные, я бы рекомендовал использовать одиночка вместо.
Глобальные переменные в C ++ объявляются с использованием extern
не статично. Увидеть ссылка для дополнительной информации.
Если вы хотите только один экземпляр вашего System
учебный класс, Вы должны использовать Синглтон.
Но шаблон Singleton следует использовать, когда вам нужен уникальный экземпляр класса, причина не в том, чтобы иметь глобальный объект. Даже если использовать этот шаблон, ваш экземпляр доступен отовсюду.
смотреть на Эта статья о шаблоне проектирования Singleton, это может быть полезно в вашем случае.
Кроме того, в C ++ объявление глобальной переменной выполняется с extern
не static
,
Я решил свою проблему. Проблема была вызвана методом Obj1-> Import, но во время отладки в qt отладчик не обращается внутрь метода, когда я нажимаю F11 (Step Into). Я не могу понять, почему?