1

一般的なソート済みリンクリストを作成したいと思います。したがって、純粋な演算子<を使用した抽象クラスDataがあります(リストを簡単に並べ替えるためです。これはcomperatorと呼ばれると思います)。これで、Dataから派生して演算子を実装するクラスJobができました。ジョブのリストを作成しようとして、そのジョブも抽象的であることがわかった場合、問題が発生します。これは、私がJobで書いた演算子が、Data-indataとまったく同じ署名を持っていないために発生します。

virtual bool operator<(const Data& other) const =0;

と仕事で:

virtual bool operator<(const Job& other) const;

ジョブを一般的なデータと比較できないため、ジョブのオペレーターでジョブを受け取る必要がありました。しかし、今では、新しい演算子は、古い演算子をオーバーライドする(または純粋であるために実装する)のではなく、古い演算子を非表示にするだけです。ダウンキャストを使用せずに問題を解決するにはどうすればよいですか?ありがとう!編集:テンプレートなし。

4

1 に答える 1

3

ダウンキャストを使用しないと... テンプレートの仕事のようです。

演算子を直接使用して比較関数の実装を強制することができ、必ずしもそれを pure として宣言する必要はありませんvirtual。しかもジェネリックです。

同じ結果、異なるアプローチ。何かから派生させる必要がないため、柔軟性が向上します (多重継承を使用し始めると、これが苦痛になる可能性があります)。

template<typename T>
class SortedLinkedList
{
    T* head;
    void insertItem(const T& item)
    {
       T* currentNode = head;
       //iterate
       {
          if ( *currentNode < item ) // force implementation of operator <
          { /* whatever */ }
       }
    }
};
于 2012-05-31T19:34:54.740 に答える