0

クラスのすべてのオブジェクトを「反復」できる構造を作成したいと考えています (場合によっては、すべての派生クラスのオブジェクトも無視されます)。ただし、「親」クラスを反復処理するべきではありません。

次のシステムがあるとします。

Aは基本クラス
Cであり、Dはその
Eから派生したものであり、 Cから派生したものです。

ここで、「D を反復処理する」場合、D を反復処理したいと思いますが、a を反復処理したくはありません。ただし、同じように「Cを反復処理」できるようにしたいと考えています-これにより、すべての「C」オブジェクトを反復処理でき、場合によってはすべてのEオブジェクトも反復処理できます(必要ではありませんが、悪くもありません) .

どうすればこれを実現できますか?

すべてのオブジェクトをリンクする「myObjects」という静的変数を配置してみました。しかし、すぐに、派生クラスで静的変数をオーバーロードできないことに気付きました。(したがって、C の「myObjects」は、A または D の「myObjects」と同じになります)

4

4 に答える 4

2
int count = std::accumulate(x.begin(), x.end(), 0, [](int current_count, A* a)
                           {
                             if (dynamic_cast<D*>(a)) ++current_count;
                             return current_count;
                           });

トリックを行う必要があります。

もちろん、利用可能なラムダがない場合は、すべてを実際の関数に入れる必要があります。

count_if バージョン:

auto count = std::count_if(x.begin(), x.end(), [](A* a) { return dynamic_cast<D*>(a) != 0; });

auto がない場合は、型を宣言する必要があります。std::iterator_traits<X_type::iterator>::difference_type

に割り当ててみることもできますintが、正しく読んでいれば、difference_type任意の整数型にすることができ、警告/オーバーフローを引き起こす可能性があります。それは疑わしいものであり、 static_cast がそれを修正します。

D* で op を呼び出したいだけの場合は、foreach と上記の方法論を使用してください。さまざまな訪問者パターンを確認することをお勧めします。

于 2010-11-17T20:55:04.707 に答える
0

A とその子の間に抽象クラスを仲介します。そこに静的オブジェクトを配置します。次に、A から直接ではなく、そこからクラスを派生させます。次に例を示します。

class A {};


 // make this class abstract, or not
class subA : A {
    static std::list<subA *> list_;
};

class C : subA {};
class D : subA {};
于 2010-11-17T20:46:01.300 に答える
0

staticサブクラスを持たないそのクラスのインスタンスのコンテナを含む各クラスによって、これを機能させることができます。

次に、構築時に、各クラスは、protectedサブクラスで使用するためのpublicコンストラクターと、継承されていないインスタンスを作成するためのコンストラクターを提供します。各クラスのコンストラクターはインスタンスのコンテナーにprotected追加しませんが、コンストラクターはコンテナーに追加します。thispublicthis

このようにして、各クラスの静的コンテナーには、サブクラスを持たないクラスのインスタンスのみが含まれます。インスタンス リストにアクセスするための基本クラスの仮想関数は、クラス固有のコンテナーにアクセスするために各サブクラスでオーバーライドできます。

破壊とコピーの構築は、コンテナを正しく維持するのに十分スマートでなければなりません。

于 2010-11-17T20:48:57.163 に答える
0

ただし、派生クラスで静的変数をオーバーロードできないことにすぐに気付きました

もちろん、変数をオーバーロードすることはできません。シグネチャが異なる可能性があるため、オーバーロードは関数にのみ適用されます。

boolオブジェクトを「既知のオブジェクトのリスト」に入れ、デフォルトとして提供するかどうかを示す を基本クラスに取るコンストラクターを作成できfalseます。true次に、オブジェクトを実際にリストに挿入する必要がある派生クラス内でのみ、そのコンストラクターを呼び出します。

しかし、継承をやめてポリシーを優先する、さらに優れた解決策がおそらくあるでしょう。

于 2010-11-17T20:39:07.737 に答える