大家好...我使用 Qt 的时间不长,但最近我想到了一个想法。
QObject
具有公共函数children()
和其他一些函数,它们返回指向子对象的指针。所以自定义类的任何客户端都可以打破封装。
如何保护我的代码免受这种野蛮对待?
为什么 Qt 开发人员将这些功能留在公共部分?他们试图达到什么目的?
我能想象到的关于此类函数的唯一一个论点与 Qt 中的“垃圾收集”有关(当一个删除父QObject
派生类实例时,所有子实例都会被自动删除)。但我认为这可以通过 Qt 的metaObject
系统来完成(我不确定机制,但是,在我看来,对子对象的访问不应该是公开的)。
- 另外,考虑当有人试图在单独的线程中使用子对象时的情况,这在 Qt 中是被禁止的......但我没有看到使用
QObject::children()
.
//------------------------------------------------ ------------------------------------------------
根据一些评论进一步解释:
虽然您可以访问QObject::children()
班级的私人成员,例如
class MyClass: public QWidget{ private: QLabel* m_lbl1; };
...
MyClass* p = new MyClass;
QLabel* pLbl = p->findChild<QLabel>();
无需将成员 m_lbl1 声明为私有成员:
class MyClass: public QWidget{ public: QLabel* m_lbl1; };
这是非常糟糕的。因为如果您的解决方案中至少有 10^5 行代码并且超过 1 个开发人员,迟早有人可以手动更改任何子成员的状态MyClass
,您可以实现任何类型的错误(例如,根据实施MyClass
)。
@Merlin069:pImpl 是 Qt 开发中的常用方法吗?