gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 23:56:16 31 4
gpt4 key购买 nike

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

  1. 如何保护我的代码免受这种野蛮对待?

  2. 为什么 Qt 开发人员将此类功能留在公共(public)部分?他们试图达到什么目的?

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

  1. 另外,考虑一下有人试图在单独的线程中使用子对象的情况,这在 Qt 中是被禁止的...但是我没有看到任何关于使用 QObject::children() 的限制>.

//-------------------------------------------- ---------------------------------------------- -

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

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

class MyClass: public QWidget{ private: QLabel* m_lbl1; };
...
MyClass* p = new MyClass;
QLabel* pLbl = p->findChild<QLabel>();

没有必要将成员 m_lbl1 声明为私有(private):

class MyClass: public QWidget{ public: QLabel* m_lbl1; };

而且非常糟糕。因为如果您的解决方案中至少有 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() 访问它。

如果你想在这里封装,那么你可以牺牲使用父/子层次结构并声明 SomeOtherClass 为 NULL 父类。

但是,如果您考虑 Qt 的对象树的原因,正如 @deGoot 提到的那样,那么它提供了这样一个有用的系统,其好处超过了打破封装。

现在,如果我们真的想保持封装并使用 QObject 亲子系统,我们可以通过使用私有(private)实现 (pimpl) 来实现,您可以 read about here .此外,在内部,Qt uses this too .

关于qt - 如何使用 QObject 派生类实例遵循 OOP 基本概念?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23553138/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com