-1

継承を見てください:

interface IArray
{
   virtual unsigned __int8* GetAddress() const = 0;

   virtual unsigned int GetItemCount() const = 0;

   virtual unsigned int GetItemSize() const = 0;
};

template<class T>
class CustomArrayT : public IArray
{
public:

   virtual unsigned __int8* GetAddress() const;

   virtual unsigned int GetItemCount() const;

   virtual unsigned int GetItemSize() const;


   T& GetItem(unsigned int index);
};

interface IFloatArray : public CustomArrayT<float>
{
   virtual IFloatArray* GetCompressedData() const = 0;
};

class ShannonFloatArray : public IFloatArray
{
public:

   virtual IFloatArray* GetCompressedData() const;
};

class FourierFloatArray : public IFloatArray
{
public:

   virtual IFloatArray* GetCompressedData() const;
};

class MickyMouseFloatArray : public IFloatArray
{
public:

   virtual IFloatArray* GetCompressedData() const;
};

質問の主な目標は、継承IFloatArray -> CustomArrayTです。インターフェイスは、抽象クラスを継承していません。多重継承をサポートしたくありません。しかし、すべてのダウンツリー クラスにクラス CustomArrayT の機能と実装インターフェイス IFloatArray が必要です。

そのような木の長所と短所は何ですか?

どうすれば別の方法でそれを行うことができますか? もしかして何かのパターン?

4

2 に答える 2

1

私は次のようにします:

template<class T>
class IArray {
public:
  virtual int size() const=0;
  virtual T map(int index) const=0;
};

すべてのポインタは不要です。

于 2013-02-01T16:13:47.113 に答える
1

あなたの階層に関する問題の 1 つは、まさに IArray インターフェイスの目的です。

インスタンス化された派生クラスを IArray への参照またはポインターとして渡したい場合は、含まれている値を追加または取得する前にダウンキャストする必要があるため、ポリモーフィズムの恩恵を受けることはできません。(IArray は、型を取得または設定することを宣言せずにゲッターまたはセッター関数を定義することはできず、その型はインスタンス化された派生クラスに依存するためです。)

基本クラスをテンプレート化できないのはなぜですか? 「基本」クラスは CustomArray である必要があり、「派生」クラスは間違いなく typedef である可能性があります。

なぜ std::vector を使わないのでしょうか? (たぶん、練習用です。)

于 2013-02-01T17:15:09.697 に答える