我有一个正在学习C++和Qt(C++和QT 4.8)的MainWindow应用程序。
我想在我的应用程序的不同对象中执行HTTP请求,例如Dialogs/Wizard和MainWindow。我知道基本上每个应用程序都应该有一个QNetworkAccessManager。我的问题是,在各个类(class)之间传递此QNAM的正确方法是什么?

目前,我将其作为指针传递给向导的构造函数,但这似乎...不够优雅和不灵活。使我的对话框或我决定制作的其他任何类访问我的一个QNetworkAccessManager的正确方法是什么?我想我需要授予所有人访问权限的任何数据都存在相同的问题。

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

我的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));
}

最佳答案

从您的问题来看,我认为您实际上是在问要使用哪种形式的依赖项注入(inject)(即将依赖的QNetworkAccessManager注入(inject)对象)。

在您的情况下,您正在使用构造函数注入(inject)。这是一种众所周知的公认注入(inject)形式。它可以根据QNetworkAccessManager强烈地传达您的向导类,从而使您的代码易于理解。如果您要使用单例从向导类实现内部简单地获取静态QNetworkAccessManager,则虽然它具有删除构造函数注入(inject)的好处,但它会隐藏您的向导类使用QNetworkAccessManager。

另一种众所周知的注入(inject)形式是Setter注入(inject),即setDelegate( delegate )
从专业上讲,您当前的方法没有什么问题,因为它再次清楚地传达您的向导类取决于QNetworkAccessManager对象。

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

Dependency Injection

Dependency Injection in C++

关于c++ - 如何在不同的类中使用QNetworkAccessManager?类之间重要数据的一般共享?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11313755/

10-09 05:23