1

C ++でテンプレートの方法でいくつかの種類のコンテナーを実装する割り当てがあります。このコンテナはすべて、あらゆる種類の演算子のオーバーロードを伴う反復子を提供する必要があります。私はテンプレートにかなり慣れていません。実際、これはこのテーマでの最初の実際のプロジェクトになります。

そして、これが私の質問です: この場合、継承でテンプレートを使用することは良い考えですか? コンテナーとイテレーターの両方で実行できますか? もしそうなら、私は何を知っておくべきですか?何をしてはいけないのですか?この件に関するヘルプは大歓迎です。

4

4 に答える 4

3

継承もテンプレートも目標ではなく、それ自体が良いも悪いもありません。問題は、どの問題を解決しようとしているのかということです。コンテナーに含まれる型による区別は、テンプレートで行う必要があります。戻り値の型が継承によって処理される場合、適切な解決策はありません。どのように封じ込めを管理し、反復子を進め、最後にテストするは、継承の良い候補ですが、それでも設計に多少依存します。

于 2013-06-06T17:47:21.780 に答える
0

あなたは間違った方向から始めています。最初に(継承の有無にかかわらず)機能すると思われるいくつかの代替案を作成し、それらの長所と短所を比較します。

または、1 つのパーティを思いつくことができない場合は、それで質問を終了します。

テンプレートを初めて使用する場合は typedef int VALTYPE;、コンテナを通常のクラスとして使用することから始めて実装することをお勧めします。それをテストし、完了したら、導入部を置き換えて、それがテンプレートになり、VALTYPE がパラメーターになるようにします。

于 2013-06-06T16:56:46.587 に答える
0

車輪の再発明を始める前に、標準とブースト ( MultiindexPointer Container LibraryGraphなど) のコンテナーを調べて、1 つを適応させてみてください。

于 2013-06-06T17:04:27.473 に答える
-1

より単純なコンテナーであるスタックを作成することから始める必要があります。スタックはインターレーターを必要としないため、単純です。

std::list の上に実装された、いくつかの継承を伴うスタックの小さな例を書きました。

最初は自分で書いてみてください。ただし、必要に応じて、これを例として見ることができます。

#include <iostream>
#include <list>

/* Here mainly to demonstrate inheritance by providing a stack interface */
template<typename T>
class IStack
{
public:

  virtual void push(const T &i) = 0;
  virtual T& pop() = 0;
};

template<typename T>
class Stack : public IStack<T>
{
private:
  std::list<T>  _internal;

public:
  virtual void push(const T &i)
  {
    _internal.push_back(i);
  }
  virtual T& pop()
  {
    T& tmp = _internal.back();
    _internal.pop_back();
    return tmp;
  }
};

編集:ジェームズが指摘したように、ベースクラスの名前を変更しました。

于 2013-06-06T17:08:55.523 に答える