C++;创建对象的全局引用 < >我试图创建一个对象的全局引用,但它似乎失败了,或者在qt C++中得到了另一个错误。

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”的类,它包含许多对象作为成员。我想从任何地方访问系统的成员,包括系统的成员。下面是我的代码:

// 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)
<代码>无效导入()在没有参数的情况下实现。哪个函数是导入(路径)?如果您希望我们帮助您调试代码,请向我们展示您的代码。不仅仅是你认为有缺陷的地方。如果你能自己找出问题区域,你就不需要问我们了。谢谢你快速、一致的回答。这个偏差类型是由错误引起的吗?我使用了单例模式,但问题仍然存在