1

EIは、さまざまなタイプの構造を実装する必要があるデータ構造クラスに関するプロジェクトを行っています。
配列、リンク、二重リンク、循環など...
これらの各構造は、スタック、キュー、またはリストのいずれかのタイプを使用します。

例:
VectorStructure.h

template<typename T>
class VectorStructure{
public:  
    int addOnPosition(T element, int pos);
    int addOnBeginning(T element);
    int add(T element);
    int addElementOrdered(T element);
    T removeFromPos(int pos);
    T removeFromBeginning();
    T remove();
    T removeElement(T element);
}

これらのタイプの各実装には、他のタイプとまったく同じコードが含まれています。
スタック: LIFO 構造であり、次のメソッドのみを使用します: add(T element) および remove();
キュー: FIFO 構造で、次のメソッドのみを使用します: add(T element) および removeFromBeginning();
List: は動的配列であり、これらのメソッドといくつかのエクストラのいずれかを使用できます。

私の考えは、これらすべての関数を基本クラスに実装し、それらの型が基本の必要なメソッドのみを使用するようにすることです。継承を使用できると思いましたが、スタックは「子」であるため、基本クラスから許可されていない関数にアクセスできましたまた、抽象クラスを使用できると考えましたが、コンパイルするには、抽象クラスに含まれるすべてのメソッドを実装する必要があります。

型 (これらは単なる例であり、すべての型で同じメソッドが他にもいくつかあります):
List.h

template<typename T>
class List{
public:
    int addOnPosition(T element, int pos);
    int addOnBeginning(T element);
    int add(T element);
    int addElementOrdered(T element);
    T removeFromPos(int pos);
    T removeFromBeginning();
    T remove();
    T removeElement(T element);

Stack.h

template<typename T>
class Stack{
public:
    int add(T element);
    T remove();

Queue.h

template<typename T>
class Queue{
public:
    int add(T element);
    T removeFromBeginning();

このアイデアを実装する方法はありますか?

4

1 に答える 1

1

あなたの質問を正しく理解しているかどうかはわかりませんが、コードの重複を避けようとしていると思います.STLが次のようなコンテナアダプタで行うように、基になるコンテナタイプをテンプレートタイプ名として渡すのはstd::stackどうですか?

template<typename T> struct BaseContainer {
    void push_front(T);
    void push_back(T);
    T pop_front();
    T pop_back(); 
};

template<typename T, typename TUnderlying = BaseContainer> class Stack {
    TUnderlying baseContainer;
    public:
        void push(T item) { baseContainer.push_back(item); }
        T pop() { return baseContainer.pop_back(); }
};

template<typename T, typename TUnderlying = BaseContainer> class Queue {
    TUnderlying baseContainer;
    public:
        void enqueue(T item) { baseContainer.push_back(item); }
        T dequeue() { return baseContainer.pop_front(); }
};
于 2013-09-26T18:47:31.243 に答える