C++ 是否可以为QObject的父对象使用共享指针?
我有一个启动类,它在构造中设置了一个C++ 是否可以为QObject的父对象使用共享指针?,c++,qt,qobject,C++,Qt,Qobject,我有一个启动类,它在构造中设置了一个SystemController: m_systemController(new SystemController(this, Provider::getSettingsAsSingleton())), 这基本上满足了: public: explicit SystemController(QObject *parent,
SystemController
:
m_systemController(new SystemController(this,
Provider::getSettingsAsSingleton())),
这基本上满足了:
public:
explicit SystemController(QObject *parent,
Settings& config);
不过,我最近想在线程类中使用这个类,这不希望我将SystemController
传递给我,因为线程类没有父类。我试着这样传递:
public:
explicit DataTestWorker(QObject *parent=0);//,
//SystemController &sysCtrl); //Obviously in my setup, it would complain about this
其中,DataTestWorker
类实际上是线程类,在DataTest
类中初始化。我想传递SystemController
的内存位置的原因是,Controller类中已经设置了重要数据,我希望访问这些数据,而不必再次运行其中的所有初始化方法
有没有一种方法可以通过某种方式传递某种“共享”指针,不仅这个类可以通过它,其他类也可以通过它来访问它。我能想到的唯一解决方法是,我可以使用DataTest
和DataTestWorker
类之间的信号和插槽来操作SystemController
中的值,但这将是冗长的
有什么想法吗?如果您需要更多信息,只需询问。您可以将
SystemController
设置为,并将QMutex
防护设置为访问并发线程中使用的SystemController
私有数据
是否可以为QObject的父对象使用共享指针
不存在。没有作为QObject子类的共享指针。我不明白为什么这会有意义
我希望传递SystemController的内存位置的原因,
控制器类是否已在类中设置了重要数据,
我希望在不运行所有初始化的情况下访问它
方法再次在它里面
为什么不将SystemController settings
的概念分离到另一个POD类\struct中呢。那么你可以选择任何一种
class SystemController : public QObject, public SystemSettings
或
并按照您的意愿进行设置 我会再试一次,但我记得当我尝试它时,编译器抛出了一个错误,因为它在构造函数中使用了
设置
单例。我再试试。我只是好奇,看看是否有一种替代的/更好的方法不使用单例。99.9%的情况下这是一个坏主意。@UmNyobe-有什么想法吗?我最近想在线程类中使用这个类,这不喜欢我把SystemController传递给我,因为线程类没有父类
,这一行很难理解,DataTestWorker
类没有父类。如果我将SystemController
传递给它,编译器会抱怨我无法传递SystemController
的地址,因为DataTestWorker
没有父对象。如果我在DataTestWorker
中创建一个新的SystemController
实例,它就会起作用,但这违背了我尝试执行的目的。明白了吗?如果只需要一个设置
类的实例和一个系统控制器
的实例,您会怎么做?我现在正在读关于共享指针的书,但我不确定这是否是正确的方向。事实上,我想我刚刚意识到你的意思。你的意思是我应该创建一个SystemController设置类,它将我的变量保存在一个简单的POD中?是的,一个只用于重新组合这些变量的类。没有信号。没有空位。没有复杂的逻辑。这个SystemSettings
类可以通过第二个设计选项由SystemController发送信号。@UmNyobe,我认为您应该在答案中添加“SystemSettings类可以通过SystemController发送信号”
class SystemController : public QObject
{
SystemSettings m_settings;
SystemSettings systemSettings() {m_settings};
}