我正在尝试创建一个对象的全局引用,但似乎失败了,或者我在Qt C ++中遇到了另一个错误。
我有一个名为'System'的类,它将许多对象保存为成员。我想从任何地方访问System的成员包括System的成员。以下是我的代码:
// 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
}
看来引用不是null但我在运行时遇到错误“访问违规读取位置......”有什么问题?
Btw Obj1是一个QObject,导入方法是公共插槽,错误可以与此相关吗?
编辑:Debuugger最后一步是在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”中它说“”
答案 0 :(得分:2)
答案 1 :(得分:2)
如果您只需要System
班级的一个实例,则应使用Singleton pattern。
但是,当你想要一个类的唯一实例时,应该使用Singleton模式,原因不应该是你想要一个对象全局的时候。即使使用此模式,您的实例也可以从任何地方访问。
关于Singleton设计模式,请查看this article,它可能对您的情况有用。
此外,在C ++中,全局变量的声明是使用extern
完成的,而不是static
。
答案 2 :(得分:-1)
我已经解决了我的问题。问题是由Obj1-> Import方法引起的,但是在qt调试期间,当我按F11(Step Into)时,调试器没有访问方法内部。我无法弄明白为什么?