6

C ++とQt(C++とQT4.8)を学ぶために取り組んでいるMainWindowアプリケーションがあります。Dialogs / WizardやMainWindowなど、アプリケーションのさまざまなオブジェクトでHTTPリクエストを実行したいと思います。基本的に、アプリケーションごとに1つのQNetworkAccessManagerが必要です。私の質問は、クラス間でこのQNAMを渡す適切な方法は何ですか?

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

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

ウィザードを起動するMainWindowコンストラクターとスロット:

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

...

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

ユーザーからデータを取得した後にネットワーク要求を行い、データを解析しているウィザードコンストラクター。したがって、QNetworkAccessManagerが必要です。

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

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

2 に答える 2

5

あなたの質問から、あなたは本当にどの形式の依存性注入(つまり、依存性QNetworkAccessManagerをオブジェクトに注入する)を使用するかを尋ねていると思います。

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

別のよく知られている注射の形態は、セッター注射です。setDelegate( delegate )

専門的に言えば、ウィザードクラスがQNetworkAccessManagerオブジェクトに依存していることを明確に伝えるため、現在のアプローチに問題はありません。

依存性注入についてもっと知りたい場合は、ここで少し読んでください。

依存性注入

C++での依存性注入

于 2012-07-03T15:33:41.950 に答える
0

別の方法がこの投稿に示されています:

このようなグローバルなアプリケーションに関連付けられたオブジェクトを管理する標準的な方法は、それらを自動変数として保持し、mainヘルパー関数を使用してそれらにアクセスすることです。オブジェクトのQPointer存続期間を自動的に追跡するため、ぶら下がることはありません。

したがって:

main.h-インターフェース

QNetworkAccessManager *nMgr();

main.cpp-実装

// This pointer is local to the translation unit, and is an
// implementation detail. It's not used anywhere else.
static QPointer<QNetworkAccessManager> globalManager;

// The global accessor method
QNetworkAccessManager *nMgr() {
  Q_ASSERT(!qApp || QThread::currentThread() == qApp->thread());
  return globalManager;
}

int main(int argc, char *argv[]) {
  QApplication app(argc, argv);
  QNetworkAccessManager mgr;
  globalManager = &mgr;
  ...
}
于 2018-06-08T08:36:18.693 に答える