【问题标题】:Is It Possible to Use a Shared Pointer for the Parent of a QObject?是否可以为 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 类已经在类中设置了重要数据,我希望无需再次在其中运行所有初始化方法即可访问这些数据。

有没有办法以某种方式将某种“共享”指针传递给它 - 不仅这个类 - 其他类都可以访问它。我能想到的唯一解决方法是我可以使用DataTestDataTestWorker 类之间的信号和槽来操作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 的实例?我目前正在阅读有关共享指针的信息 - 但我不确定这是否是正确的方向。

标签: c++ qt qobject


【解决方案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 单例。我再试一次。我只是想知道是否有比这更好的替代/更好的方法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多