2012-04-27 11 views
1

一意のBIS_Dataクラスによって継承される、非常に一般的な純粋仮想クラスi_BIS_Dataを作成したいとします。C++の構造体のオーバーロード

i_BIS_Dataのすべての子供がbis_data構造体をすべて同じものにすることを希望します。私は私の子供のクラスには、次のようになりことを期待:

class BIS_0192_Aircraft_ID_Data : i_BIS_Data 
{ 
    public: 

    struct bis_data 
    { 
    UInt16 acid; 
    UInt16 parity; 
    }; 

    void setData(bis_data data){ m_data.parity = data.parity; 
          m_data.acid = data.acid; } 
} 

私はBIS_0192_Aircraft_ID_Dataを使用するクラスをコンパイルしようとすると、私は次のエラーを取得:エラーC2061:構文エラー:識別子「bis_data」を。親クラスの中でbis_dataを定義していないので、私はそれを信じています。

構造を「オーバーロード」でき、複数の子クラスがbis_dataの定義を可能にすることは可能ですか?

答えて

3
template<typename BIS_DATA_T> 
class i_BIS_Data 
{ 
     typedef BIS_DATA_T bis_data; 
     ... 
     virtual void setData(bis_data data) = 0; 
}; 

struct bis_0192_data 
{ 
    UInt16 acid; 
    UInt16 parity; 
}; 

class BIS_0192_Aircraft_ID_Data : public i_BIS_Data<bis_0192_data> 
{ 
    public: 
    void setData(bis_data data){ m_data.parity = data.parity; 
         m_data.acid = data.acid; } 
}; 

これは動作するはずですが、しかし、XXのためのさまざまな種類とi_BIS_Data<XX>のサブクラスに互換性がありません。

+1

+1。あなたは、テンプレートベースのソリューションで私を16秒倒す。この後者の問題(共通ではない基底クラス)は、テンプレートクラスを非テンプレートクラスから派生させることで修正できます。 –

+0

これは、最初の問題はすべてのサブタイプが差分構造定義を持っていると述べたので、i_BIS_Data *を使用してサブタイプのいずれかを参照することはできません。ダビデの解決策はおそらくそれが得られるほど良いものです。 –

+0

@WayneTanner:LSPに違反するため、サブタイプではありません。 –

2

OOP理論号

、関数オーバーロードの引数は反変することができ、戻り型が共変であることができます。

C++では、共変リターン型は使用できますが、パラメータ型は不変です。

あなたが求めているのは、理論的には間違っているだけでなく、C++では許されない引数型の共分散です。

Liskov Substitution Principleについてお読みになることをお勧めします。継承を使用してクラス階層を設計する際には、非常に役立ちます。

+0

すべての子が有効インターフェースを継承することができるように、できるだけ一般的なようにsetDataを定義するための可能な方法はありますか? – Kat

+1

@Kat: 'ベクトル'を指定して、どのように関数を呼び出すかを示してください...そうしようとすると、なぜこの関数をインタフェースの一部として含めるのが理にかなっていません。 –

+0

私はi_BIS_Data関数を呼び出すつもりはない - クラスはインスタンス化できません。関数を実行するプロシージャを含む子クラスです。 – Kat

1
class i_BIS_Data 
{ 
    public: 

    i_BIS_Data(void) { } 
    virtual ~i_BIS_Data(void) { } 

    virtual void setData(void* data) = 0; 
}; 


class BIS_0192_Aircraft_ID_Data : i_BIS_Data 
{ 
    public: 

    struct bis_data 
    { 
    UInt16 acid; 
    UInt16 parity; 
    }; 

    bis_data m_data; 

    void setData(void* data) 
    { 
     m_data = *(bis_data*)data; 
     // m_data.parity = data.parity; 
     // m_data.acid = data.acid; 
    } 
}; 

例:

BIS_0192_Aircraft_ID_Data::bis_data data; 

data.acid = 7; 
data.parity = 8; 

BIS_0192_Aircraft_ID_Data c; 

c.setData((void*)&data); 
+0

ありがとうございます。上記の回答が掲載されていない場合は、私はこのソリューションを使用していました。私は空のポインタから離れようとしていました。 :) – Kat