如何在不同的类中使用QNetworkAccessManager?课程之间的重要数据的一般共享?

MJB*_*Boa 6 c++ oop qt qnetworkaccessmanager

我有一个MainWindow应用程序,我正在努力学习C++和Qt(C++和QT 4.8).我想在我的应用程序的不同对象中执行HTTP请求,例如Dialogs/Wizard和MainWindow.我知道我基本上应该为每个应用程序配备一个QNetworkAccessManager.我的问题是,在课间通过这个QNAM的正确方法是什么?

目前我将它作为指针传递给我的向导的构造函数,但这似乎......不优雅且不灵活.给我的Dialogs或我决定做的其他任何类的正确方法是什么,访问我的一个QNetworkAccessManager?我想我对提供所有访问权限所需的任何数据都有同样的问题.

什么是正确的C++设计解决方案?单身模式似乎是一种选择,但据我所知,这是一个糟糕的模式.我在这里有一些代码来展示我的问题.

我的MainWindow构造函数和插槽启动我的向导:

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

...

MyMainWindow::wizardStarter
{
    mywizard = MyWizard(vari, qnam, this);
}
Run Code Online (Sandbox Code Playgroud)

我的向导构造函数,我在从用户获取数据后进行网络请求和解析数据,因此我需要一个QNetworkAccessManager:

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

MyWizard::launchRequest(QUrl newUrl)
{
    ourQnam->get(QNetworkRequest(newUrl));
}
Run Code Online (Sandbox Code Playgroud)

Mat*_*hew 5

从您的问题来看,我认为您确实在询问使用哪种形式的依赖注入(即将依赖的QNetworkAccessManager注入对象).

在您的情况下,您正在使用构造函数注入.这是一种完全已知和可接受的注射形式.它强烈地传达您的向导类取决于 QNetworkAccessManager,它使您的代码易于人们理解.如果你使用单例来简单地从向导类实现中获取静态QNetworkAccessManager,虽然它具有删除构造函数注入的好处,但它隐藏了你的向导类使用QNetworkAccessManager.

另一种众所周知的注射形式是Setter InjectionsetDelegate( delegate )

从专业角度讲,您当前的方法没有任何问题,因为它清楚地表明您的向导类依赖于 QNetworkAccessManager对象.

如果您有兴趣了解有关依赖注入的更多信息,请阅读以下内容.

依赖注入

C++中的依赖注入