Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt 如何使用QObject派生类实例遵循OOP基本概念?_Qt_Oop_Parent Child_Qobject_Qmetaobject - Fatal编程技术网

Qt 如何使用QObject派生类实例遵循OOP基本概念?

Qt 如何使用QObject派生类实例遵循OOP基本概念?,qt,oop,parent-child,qobject,qmetaobject,Qt,Oop,Parent Child,Qobject,Qmetaobject,大家好。。。我和Qt合作的时间不长,但最近我想到了一个想法。 QObject具有公共函数children()和一些其他函数,它们返回指向子对象的指针。 因此,任何自定义类的客户端都可以破坏封装 我怎样才能保护我的代码免受如此野蛮的对待 为什么Qt开发人员将这些功能留在公共部分? 他们试图达到什么目的 关于这些函数,我能想象的唯一一个参数是与Qt中的“垃圾收集”有关的(当一个delete父类QObject派生类实例时,所有子类实例都会自动删除)。但我认为这可以通过Qt的元对象系统来实现(我不确定该

大家好。。。我和Qt合作的时间不长,但最近我想到了一个想法。
QObject
具有公共函数
children()
和一些其他函数,它们返回指向子对象的指针。 因此,任何自定义类的客户端都可以破坏封装

  • 我怎样才能保护我的代码免受如此野蛮的对待

  • 为什么Qt开发人员将这些功能留在公共部分? 他们试图达到什么目的

  • 关于这些函数,我能想象的唯一一个参数是与Qt中的“垃圾收集”有关的(当一个delete父类
    QObject
    派生类实例时,所有子类实例都会自动删除)。但我认为这可以通过Qt的
    元对象
    系统来实现(我不确定该机制,但我认为,访问子对象不应该是公开的)

    同时,考虑有人试图在单独线程中使用子对象的情况,这在QT中是被禁止的。但是在使用
    QObject::children()
    时,我看不到任何限制 //------------------------------------------------------------------------------------------------

    根据一些评论进一步解释:

    而您可以使用
    QObject::children()
    访问类的私有成员,例如

    class MyClass: public QWidget{ private: QLabel* m_lbl1; };
    ...
    MyClass* p = new MyClass;
    QLabel* pLbl = p->findChild<QLabel>();
    
    这很糟糕。因为如果您的解决方案中至少有10^5行代码,并且有超过1名开发人员,那么迟早有人可以手动更改
    MyClass
    的任何子成员的状态,并且您可以实现任何类型的错误(例如,根据
    MyClass
    实现不可能实现的行为)


    @Merlin069:pImpl是Qt开发中的常用方法吗?

    Qt对象的父系统非常有用,但我想我理解您得到了什么

    例如,假设此处声明的所有对象都派生自QObject:-

    class MyClass : public QObject
    {
        Q_OBJECT
    
        private:
            SomeOtherClass* m_pOtherClass = nullptr; // C++ 11 initialisation
    };
    
    在MyClass的构造函数中

    m_pOtherClass = new SomeOtherClass(this);
    
    因此,我们现在有了封装的SomeOtherClass对象,但由于它的父对象是MyClass,因此也可以通过MyClass中的函数children()访问它

    如果您希望在这里进行封装,那么可以牺牲使用父/子层次结构,并使用空父声明其他类

    但是,如果考虑Qt对象树的原因,正如@ DEGOOT提到的那样,那么它提供了一个有用的系统,其好处大于破坏封装。p>


    现在,如果我们真的想维护封装并使用QObject家长系统,我们可以通过使用私有实现(pimpl)来实现,您可以这样做。此外,从内部来看,.

    我认为这是架构的一部分,我个人认为这很聪明。我不明白你所说的“破坏封装”或“保护你的代码不受这种处理”是什么意思。你能详细说明一下吗?你担心什么“治疗”?请注意Qt是基于C++的,它不是一种“托管”语言,所以你可以确保你的代码没有“野蛮”地对待任何东西。我发现piml是实现C++封装的最好方法。如果您在头文件中“公开”类的私有成员,总有人可以使用指针操作破坏封装。Qt大量使用Pimpl。如果您查看它们的源代码(毕竟是开源的),您将看到大多数私有数据都隐藏在私有对象中,这些私有对象在“public”对象中引用。
    m_pOtherClass = new SomeOtherClass(this);