C++;创建对象的全局引用 < >我试图创建一个对象的全局引用,但它似乎失败了,或者在qt C++中得到了另一个错误。
我有一个名为“System”的类,它包含许多对象作为成员。我想从任何地方访问系统的成员,包括系统的成员。下面是我的代码:C++;创建对象的全局引用 < >我试图创建一个对象的全局引用,但它似乎失败了,或者在qt C++中得到了另一个错误。,c++,qt,object-reference,global-object,C++,Qt,Object Reference,Global Object,我有一个名为“System”的类,它包含许多对象作为成员。我想从任何地方访问系统的成员,包括系统的成员。下面是我的代码: // System.h class System { public: Obj1* m_obj1; Obj2* m_obj2; System(); ~System(); static System* GetGlobalReference(); } // System.cpp static System* GlobalRefere
// 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,但我在运行时收到一个错误“访问冲突读取位置…”怎么了
顺便说一句,Obj1是QObject,导入方法是公共插槽,错误是否与此相关
编辑:去毛刺的最后一步在qgenericacomic.h中
T load(const T &_q_value) Q_DECL_NOTHROW
{
return _q_value; // -> Debugger stops here
}
Edit2:我使用了单例模式,正如答案所说,但我的问题仍然存在
System::GetInstance()->GetObj1()->Import(path); // after this line
在“\u q\u value”中,它表示“如果您希望有全局变量,我建议使用一个
< > C++中的全局变量使用<代码> ExtNe>代码>声明,不是静态的。有关详细信息,请参阅。如果您只需要
系统的一个实例
类,则应使用
但是,当您想要一个类的唯一实例时,应该使用单例模式,而不是当您想要一个全局对象时。即使使用此模式,您的实例也可以从任何地方访问
看看关于单例设计模式,它在您的案例中可能很有用
<>也可以,在C++中,全局变量的声明是用<代码> ExtNe>代码>,不是<代码>静态< /代码>。< /p> < p>我已经解决了我的问题。该问题是由Obj1->Import方法引起的,但在qt中调试期间,当我按F11时,调试器未访问方法内部(单步执行)。我不明白为什么?对于您的系统类,您应该使用Singleton模式。感谢您快速、一致的回答。您向我们展示了大量代码,但没有展示Obj2是什么。实际上我想知道为什么你的代码会编译。
GetObj1()
是否返回Obj1?如果是这样,则在其中调用Import(path)
<代码>无效导入()代码>在没有参数的情况下实现。哪个函数是导入(路径)?如果您希望我们帮助您调试代码,请向我们展示您的代码。不仅仅是你认为有缺陷的地方。如果你能自己找出问题区域,你就不需要问我们了。谢谢你快速、一致的回答。这个偏差类型是由错误引起的吗?我使用了单例模式,但问题仍然存在