-1

プログラムのどこからでもアクセスできる QT ダイアログがあります。基本的に私がする必要があるのは、プログラムのどこかにその静的インスタンスを作成するようなものです。

'''注''': これは私がやろうとしていることの単なる例であり、実際のコードではありません (ここに投稿するには長すぎます)

class Core
{
  public:
    static DialogType *MyDialog;
};

DialogType *Core::MyDialog = NULL;

// later in main.cpp

int main(int argc, char *argv[])
{
    try
    {
        Core::Init();
        QApplication a(argc, argv);
        Core::MyDialog = new DialogType();
        ...

ただし、これは他のタイプでは機能しますが、QDialog から継承されたクラスでは機能しません。コンパイラは単に戻ります: DialogType は型に名前を付けません (そして、はい、DialogType の宣言でその .h ファイルを #include します)

私は何を間違っていますか?QTがそれを許可しないのはなぜですか?プログラム内の任意のクラスからダイアログの単一インスタンスにアクセスできるようにするにはどうすればよいですか?

4

2 に答える 2

2

使用している型をコンパイラが認識できないというエラーが発生した場合は、前方宣言を挿入する#includeか、前方宣言または定義のいずれかを含むヘッダー ファイルを挿入する必要があります。

メンバー型がポインターまたは参照の場合は前方宣言で十分ですが、それ以外の ADT の場合はが必要に#includeなります。

投稿したコードでは、次のことが可能です。

Core.h:

class DialogType; // forward declaration.

class Core
{
  public:
    static DialogType *MyDialog;
};

ソース ファイルには、次のように記述できます。

コア.cpp:

#include "Core.h"
#include "DialogType.h"

DialogType *Core::MyDialog = new DialogType();
于 2013-09-12T16:57:54.623 に答える
2

その特定のクラスの常に使用可能な単一のインスタンスが本当に必要な場合は、Singleton パターンから構築して、ポインターを作成して返すか、作成された場合は単にポインターを返すことができます。多くの場合、シングルトンは多くの障害があるため推奨されますが、これらの線に沿ったものについては、QDialog継承されたクラスへの静的参照を設定するよりもおそらく簡単です。

于 2013-09-12T16:17:11.730 に答える