1

外部の 2 つの派生クラス間で特定の属性をコピーする効率的な方法 (ポリモーフィズムを使用) を見つけようとしています。基本クラスから派生した一連のデータ クラスがありますDataClassADataClassAこれらのデータ クラスを、参照を入力および出力パラメーターとして受け取る別のフィルター クラスで操作したいと考えています。フィルタは に共通する必要な操作を実行しますが、DataClassAクラス固有の属性を入力クラスから出力クラスに伝播したいと考えています。検討:

class DataClassA
{
public:
    virtual void copyAttributes( DataClassA& copyFrom );
}

class DataClassB : public DataClassA
{
public:
    virtual void copyAttributes( DataClassA& copyFrom );
};

class DataFilter
{
    void run( DataClassA& input, DataClassB& output )
    {
        //do some calculations here
           ...
        //then copy over attributes
        output.copyAttributes( input );
    }
};

私の問題は明らかにcopyAttributes()、入力と出力の両方の派生クラスの型を知る必要があることに依存していることです (必ずしも同じである必要はありません)。ただし、フィルターは基本クラスへの参照のみを処理しますDataClassA。私の反射神経は単純に を導入することですdynamic_castが、手を叩かれるリスクがあります (およびその他の悪影響が考えられます)。これを行った場合、親クラスのcopyAttributesを呼び出した派生クラスごとにメソッドを作成し、それを使用してオブジェクトが同じ型かどうかを確認します。copyAttributesdynamic_castcopyFrom

void DataClassB::copyAttributes( DataClassA& copyFrom )
{
    //copy attributes from parent class  
    DataClassA::copyAttributes( copyFrom );

    //test if the class being copied from is of type DataClassB
    DataClassB* copyPtr = dynamic_cast<DataClassB*>&copyFrom;
    if( copyPtr != NULL )
    {
        //copy DataClassB-specific attributes from copyFrom to this
        ...
    }
}

この問題について私が見つけた最も類似した投稿は、ここVirtual functions and polymorphismでした。私の主な質問は次のとおりです。1) 私の提案した dynamic_cast の使用は不適切ですか?; copyAttributes2)もしそうなら、どうすればこれを別の方法で実装できますか? ビジターデザインパターンの使用についての言及がありましたが、それがどのように見えるかはわかりません.

これは、Visualization Toolkit (VTK) が行うことの単純なバージョンの一種で、さまざまなデータ クラスで動作するフィルターのクラスを使用しているという意味です。興味深いことに、データ型の正しいダウンキャストのために直接比較できるクラスと親クラスの文字列名を含むマクロを含めることで、RTTI を処理します。

4

1 に答える 1

0

マルチディスパッチが必要なようです(私がここで行ったように:https://ideone.com/8VxALs
訪問者が各派生型を知っている必要があります。

もう 1 つの方法は、dynamic_cast毎回 a を使用することです。

単純な二重ディスパッチは、次のように実行できます。

class DataClassA
{
public:
    virtual ~A() {}
    virtual void copyAttributes(DataClassA& copyFrom) { copyFrom.copyAttributesToA(*this); }
    virtual void copyAttributesToA(DataClassA& copyTo) { /* Implementation to copy A -> A */ }
    virtual void copyAttributesToB(DataClassB& copyTo) { /* Implementation to copy A -> B */ }  
};

class DataClassB : public DataClassA
{
public:
    void copyAttributes(DataClassA& copyFrom) override { copyFrom.copyAttributesToB(*this); }
    void copyAttributesToA(DataClassA& copyTo) override { /* Implementation to copy B -> A */ }
    void copyAttributesToB(DataClassB& copyTo) override { /* Implementation to copy B -> B */ }
};
于 2014-05-03T02:08:10.407 に答える