私のプロジェクトには、さまざまなタイプのQObjectのツリーがあります。私が話していることのアイデアをあなたに与えるべきである簡単な例をあなたに与えましょう。これは、典型的なQObjectツリー(継承図ではありませんが、クラス図にいくらか似ています)である可能性があります。ここでは、ルートオブジェクトを一番上から開始し、その子オブジェクトを下にリストします。
City
|
Street
/ \
House ...
/ \
Floor ...
/ \
Room ...
QObjectツリーは必ずしもこのルールに従う必要はありませんが、私の場合、ツリー内の非常にクラスに1つの特定のタイプの親があります。したがって、例として1つの関係にとどまるために、家にはいくつかのフロアと他のタイプの子を含めることができますが、フロアは家の子であり、家だけです。
これらをQObject派生クラスとしてモデル化すると、のインターフェイスは、内部的に何であるかを調べることによってclass Floor
、そのクラスを提供するはずです。私はこの親がタイプになることを本当に知っています。なぜなら、私はそれをそうするように設計し、プログラマーはこの設計に固執するからです。House *house()
QObject::parent()
House*
CスタイルでキャストQObject *parent()
しHouse*
て実装しても大丈夫House *house() const
ですか?
Qtは、を使用することを提案し、から継承しない場合はqobject_cast<House*>(parent())
戻り、キャストをタイプセーフにします。しかし、リリースモードでは、このようなスローキャストは避けたいと思います。qobject_castsの代わりにCスタイルのキャストを実行すると、3倍高速に実行される特定のアルゴリズムのプロファイルを作成しました。これは、qobject_castが実行時にtype-infoについてメタオブジェクトに問い合わせるため、頻繁に呼び出されるとかなりの速度低下が発生するためです。0
QObject* parent()
House
だから私が最終的に得たのは:
House *Floor::house() const {
Q_ASSERT(qobject_cast<House*>(parent()));
return (House*)parent();
}
これは、デバッグモードでは親が実際にはハウスであると主張しますが、リリースモードでは効率的にCスタイルのキャストを行います。
要点:C ++プログラマーがCスタイルのキャストを行うと、人々は大声で叫ぶでしょうが、この状況では問題ありませんか?
別の解決策は、特定のタイプの親ポインターをメンバー変数として追加で格納することですが、これは冗長であり、ツリーがツリーの親を返すメソッドに反映されることも気に入っています。