是否可以为 QObject 的父级使用共享指针?
Posted
技术标签:
【中文标题】是否可以为 QObject 的父级使用共享指针?【英文标题】:Is It Possible to Use a Shared Pointer for the Parent of a QObject? 【发布时间】:2014-09-29 07:59:22 【问题描述】:我有一个这样的启动类,它在构造中设置了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
中的值,但这会很长而且很冗长。
有什么想法吗?如果您需要更多信息,请询问。
【问题讨论】:
不要使用单例。 99.9% 的情况下是个坏主意。 @UmNyobe - 有什么想法吗?I've recently though wanted to use this class in a threaded class, which doesn't like me passing me the SystemController as the threaded class doesn't have a parent
这行好难懂
DataTestWorker
class 没有父级。如果我将SystemController
传递给它,编译器会抱怨我无法将SystemController
的地址传递给它,因为DataTestWorker
没有父级。如果我在DataTestWorker
中创建SystemController
的新实例,它会起作用,但这违背了我想要做的事情的目的。清楚吗?
那么你会怎么做 - 如果你只想要一个 Settings
类的实例和一个 SystemController
的实例?我目前正在阅读有关共享指针的信息 - 但我不确定这是否是正确的方向。
【参考方案1】:
是否可以为 QObject 的父级使用共享指针?
没有。没有共享指针,它是 QObject 的子类。而且我不明白为什么会有意义。
之所以要传递SystemController的内存位置, 是控制器类已经在类中设置了重要数据, 我希望无需运行所有初始化即可访问 再次调用其中的方法。
为什么不将SystemController settings
的概念分离到另一个 POD 类\结构中。然后你可以有任何一个
class SystemController : public QObject, public SystemSettings
或
class SystemController : public QObject
SystemSettings m_settings;
SystemSettings systemSettings() m_settings;
并根据需要使用设置。
【讨论】:
其实我想我才明白你的意思。你的意思是我应该创建一个 SystemController 设置类,它将我的变量保存在一个简单的 POD 中? 是的,一个只是为了重新组合这些变量的类。没有信号。没有插槽。没有复杂的逻辑。这个SystemSettings
类可以由 SystemController 以信号形式发送,采用第二种设计选择。
@UmNyobe,我认为您应该在答案中添加“SystemSettings 类可以由 SystemController 在信号中发送”【参考方案2】:
您可以将SystemController
调整为Singleton,并设置QMutex
保护以访问并发线程中使用的SystemController's
私有数据。
【讨论】:
我会再试一次,但我记得当我尝试过时,编译器抛出了一个错误,因为它在其构造函数中使用了Settings
单例。我再试一次。我只是想知道是否有比这更好的替代/更好的方法以上是关于是否可以为 QObject 的父级使用共享指针?的主要内容,如果未能解决你的问题,请参考以下文章
强制 QObject 作为 QWidget 的父级有啥后果?