3

オブジェクトのグローバル参照を作成しようとしていますが、失敗したように見えるか、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

}

参照が 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

2

Systemクラスのインスタンスが 1 つだけ必要な場合は、 Singleton パターンを使用する必要があります。

ただし、クラスの一意のインスタンスが必要な場合はシングルトン パターンを使用する必要があります。その理由は、オブジェクトをグローバルにしたい場合ではありません。このパターンを使用している場合でも、インスタンスはどこからでもアクセスできます。

シングルトンの設計パターンに関するこの記事を見てください。あなたの場合に役立つかもしれません。

また、C++ では、グローバル変数の宣言はexternではなくで行われstaticます。

于 2013-09-06T10:03:55.923 に答える
-1

問題を解決しました。この問題は Obj1->Import メソッドが原因でしたが、qt でのデバッグ中に F11(Step Into) を押すと、デバッガーがメソッド内にアクセスしません。なぜだか分かりません。

于 2013-09-06T11:10:24.903 に答える