3

我正在尝试创建一个对象的全局引用,但它似乎失败了,或者我在 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

}

似乎引用不为空,但在运行时出现错误“访问冲突读取位置......”出了什么问题?

顺便说一句 Obj1 是一个 QObject 并且 Import 方法是一个公共插槽,错误是否与此有关?

编辑:调试器最后一步在 QGenericAtomic.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

在“_q_value”中它说“”

4

3 回答 3

3

如果您希望使用全局变量,我建议您使用单例

C++ 中的全局变量是使用声明的extern,而不是静态的。有关详细信息,请参阅参考资料

于 2013-09-06T09:47:26.850 回答
2

如果你只想要你的System的一个实例,你应该使用单例模式

但是,当您想要一个类的唯一实例时应该使用单例模式,原因不应该是当您想要一个全局对象时。即使使用这种模式,您的实例也可以从任何地方访问。

看看这篇关于单例设计模式的文章,它可能对你的情况有用。

此外,在 C++ 中,全局变量的声明是用 完成的extern,而不是static.

于 2013-09-06T10:03:55.923 回答
-1

我已经解决了我的问题。问题是由 Obj1->Import 方法引起的,但是在 qt 中调试期间,当我按 F11(Step Into)时,调试器没有访问方法内部。我想不通为什么?

于 2013-09-06T11:10:24.903 回答