我有一个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);
}
我的向导构造函数,我在从用户获取数据后进行网络请求和解析数据,因此我需要一个QNetworkAccessManager:
MyWizard::MyWizard(SomeOtherArgument *vari, QNetworkAccessManager *qnam, QObject *parent)
{
...
this->ourQnam = qnam;
...
}
MyWizard::launchRequest(QUrl newUrl)
{
ourQnam->get(QNetworkRequest(newUrl));
}
答案 0 :(得分:5)
从您的问题来看,我认为您确实在询问使用哪种形式的 依赖注入 (即将您的从属QNetworkAccessManager注入对象)。
在您的情况下,您正在使用 构造函数注入 。这是一种完全已知和可接受的注射形式。它强烈地传达了您的向导类依赖于 QNetworkAccessManager,它使您的代码易于人们理解。如果你使用单例来简单地从向导类实现中获取静态QNetworkAccessManager,虽然它具有删除构造函数注入的好处,但它隐藏了你的向导类使用QNetworkAccessManager。
另一种众所周知的注射形式是 Setter Injection ,即setDelegate( delegate )
从专业角度讲,您当前的方法没有任何问题,因为它明确地传达了您的向导类依赖于 QNetworkAccessManager对象。
如果您有兴趣了解有关依赖注入的更多信息,请阅读以下内容。
答案 1 :(得分:0)
另一种方式显示在this帖子中:
管理此类全局应用程序绑定对象的规范方法是将它们作为自动变量保存在
InvalidOperationException
中,并使用辅助函数来访问它们。main
会自动跟踪对象的生命周期,因此永远不会悬空。
因此:
main.h - 界面
QPointer
main.cpp - 实施
QNetworkAccessManager *nMgr();