1

一意のBIS_Dataクラスに継承される非常に汎用的な純粋な仮想クラスi_BIS_Dataを作成したいと思います。

class i_BIS_Data
{
public:

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

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

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とは何かを定義できるようにすることは可能ですか?

4

3 に答える 3

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; }
 };

これは機能するはずi_BIS_Data<XX>ですが、XX の型が異なる のサブクラスは互換性がありません。

于 2012-04-27T16:51:00.643 に答える
2

いいえ。

OOP理論では、関数のオーバーロードの引数は反変であり、戻り値の型は共変である可能性があります。

C ++では、共変の戻り型が許可されますが、パラメーターの型は不変です。

あなたが求めているのは、引数タイプの共分散です。これは理論的には間違っているだけでなく、C++では許可されていません。

リスコフの置換原則についてお読みになることをお勧めします。継承を使用してクラス階層を設計するときに、非常に役立ちます。

于 2012-04-27T16:44:16.030 に答える
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);
于 2012-04-27T17:05:06.010 に答える