2012-07-03 4 views
6

私はC++とQt(C++とQT 4.8)を学ぶために取り組んでいるMainWindowアプリケーションを持っています。 私のアプリケーションの異なるオブジェクト(ダイアログ/ウィザードやMainWindowなど)でHTTPリクエストを行いたいです。私は基本的にアプリケーションごとに1つのQNetworkAccessManagerを持つことになっていることを知っています。私の質問は、クラス間でこのQNAMを渡す適切な方法は何ですか?QNetworkAccessManagerをさまざまなクラスで使用する方法は?クラス間の重要なデータの一般的な共有?

私はそれをポインタとして持っていますが、私はウィザードのコンストラクタに渡しますが、これは控えめで柔軟性がないようです。 QNetworkAccessManagerにアクセスするために、私のダイアログや他のクラスを与える適切な方法は何ですか?私はすべてのアクセスを与えるために必要なデータについて、同じ質問をしていると思います。

適切にC++で設計されたソリューションはここにありますか?シングルトンのパターンはオプションのようですが、私が理解するように悪いものです。私は私の質問を示すためにここに少しのコードがあります。

MyMainWindow::MyMainWindow 
{ 
    qnam = new QNetworkAccessManager(); 
} 

... 

MyMainWindow::wizardStarter 
{ 
    mywizard = MyWizard(vari, qnam, this); 
} 

マイウィザードコンストラクタいる私はネットワーク要求を作ってるんだし、ユーザからデータを取得した後、データを解析し、そのためここで私が必要QNetworkAccessManager:私のウィザードを起動

私のメインウィンドウコンストラクタとスロット:、私はあなたが本当に(つまり、あなたのdepenを注入依存性注入のどの形を求めているあなたの質問から

MyWizard::MyWizard(SomeOtherArgument *vari, QNetworkAccessManager *qnam, QObject *parent) 
{ 
    ... 
    this->ourQnam = qnam; 
    ... 
} 

MyWizard::launchRequest(QUrl newUrl) 
{ 
    ourQnam->get(QNetworkRequest(newUrl)); 
} 
+0

私はシングルトンデザインパターンをお勧めします。なぜあなたはこのパターンが悪いと思いますか? – hamed

+1

@hamed、シングルトンは、適切な依存関係注入を使用しない場合、クラス間の依存関係を非表示にします。シングルトンのデザインパターンに間違いはありません。あなたのクラスがシングルトンに依存していることを伝えるために、適切な注入を使用してください。 – Matthew

+0

シングルトンの場合は、どのようにして適切な注入を追加しますか? – MJBoa

答えて

5

考えますQNetworkAccessManagerをオブジェクトに入れたもの)を使用します。

あなたのケースでは、コンストラクタインジェクションを使用しています。これは完全に知られており、受け入れられている注射の形態です。あなたのウィザードクラスを強く伝えます QNetworkAccessManagerに依存していますので、人々が理解しやすいコードになります。シングルトンを使用してウィザードクラスのインプリメンテーションから静的なQNetworkAccessManagerを簡単に取得する場合は、コンストラクターインジェクションを削除する利点がありますが、ウィザードクラスでQNetworkAccessManagerが使用されていません。

注入の別のよく知られた形であるセッター・インジェクションすなわちsetDelegate(delegate)

プロあなたの現在のアプローチと間違って何もそれは明らか QNetworkAccessManagerオブジェクトに依存し、あなたのウィザードクラスの通信を行うよう改めてありません話します。

ここでは、依存性注入についてもっと学ぶことに興味がある場合は、少し読んでいます。

Dependency Injection

Dependency Injection in C++

関連する問題