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