1

私のプロジェクトには、さまざまなタイプの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-in​​foについてメタオブジェクトに問い合わせるため、頻繁に呼び出されるとかなりの速度低下が発生するためです0QObject* parent()House

だから私が最終的に得たのは:

House *Floor::house() const {
    Q_ASSERT(qobject_cast<House*>(parent()));
    return (House*)parent();
}

これは、デバッグモードでは親が実際にはハウスであると主張しますが、リリースモードでは効率的にCスタイルのキャストを行います。

要点:C ++プログラマーがCスタイルのキャストを行うと、人々は大声で叫ぶでしょうが、この状況では問題ありませんか?

別の解決策は、特定のタイプの親ポインターをメンバー変数として追加で格納することですが、これは冗長であり、ツリーがツリーの親を返すメソッドに反映されることも気に入っています。

4

1 に答える 1

3

メンテナンス中であっても所有権グラフが変更されないことが確実な場合は、タイプチェックされていないキャストが安全です。を使用できますstatic_cast<House*>(parent())。これは高速ですが、本当に必要な場合は、Cスタイルのキャストで問題ありません。ただし、CスタイルのキャストはC++より高速ではありませんstatic_cast

于 2012-10-04T20:55:42.330 に答える