3

こんにちは... 私は Qt を長い間使用していませんが、最近、ある考えが頭に浮かびました。 QObjectpublic 関数と、子オブジェクトへのポインターchildren()を返す他のいくつかの関数があります。そのため、カスタム クラスのクライアントはカプセル化を破ることができます。

  1. このような野蛮な扱いからコードを保護するにはどうすればよいでしょうか?

  2. Qt 開発者がそのような機能をパブリック セクションに残したのはなぜですか? 彼らはどのような目的を達成しようとしましたか?

私が想像できるそのような関数に関する唯一の引数は、Qt の「ガベージ コレクション」に関連するものです (1 つの親QObject派生クラス インスタンスを削除すると、すべての子インスタンスが自動的に削除されます)。しかし、Qt のシステムでそれを行うことができると思いますmetaObject(メカニズムについてはわかりませんが、子オブジェクトへのアクセスは公開すべきではない、と私は考えています)。

  1. また、誰かが別のスレッドで子オブジェクトを使用しようとする状況を考慮してください。これは 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 の開発における一般的なアプローチですか?

4

1 に答える 1