1

タイプ Node のオブジェクトのみを扱うリンク リスト クラス (List) があります。適切にオーバーロードされたブール比較があると仮定すると、これらのノードであらゆる種類のことを実行できます。問題は、この List クラスを Term (係数と指数または次数を持つ代数項) と呼ばれる特別な種類のノードで使用したいということです。Node ポインターを使用して用語を処理する場合でも、List クラスに Term 関数 (Term には特別なバージョンの Print() 関数と比較演算子があります) を使用するように指示するにはどうすればよいですか? たとえば、私の Print() は次のようなものです。

Node* walker=head;
while(walker)
{
     walker->Print();
     walker=walker->next;
}

Node::Print() がないことを除いて、Term::Print() を呼び出したいのです! Term クラス オブジェクトを処理するために、まったく新しい List クラスを作成する必要がありますか?

4

3 に答える 3

1

これはポリモーフィズムの典型的な例です。WhozCraig が提案したように、関数 Print() を Node クラスに追加できます。(C++ の仮想関数と抽象クラスを読んでください。) Print() を仮想関数にすることができます。Print() を純粋仮想関数にするかどうかを決定できます。純粋仮想関数の場合は、基底クラスでこのように宣言されます。

class Node{
  virtual void Print() = 0;
  // If you don't want this to be pure virtual 
  // You can give a generic definition
}

この場合、基本クラスで Print() を定義していないため、abstract を意図していない各派生クラスは、このメソッドを実装する必要があります。したがって、Term クラスは Node クラスから派生し、それに応じて Print() メソッドを実装できます :) そして、基本クラスのポインタを使用してこの関数を呼び出すことができます。将来、Node をサブクラス化し、Print() の別の実装を追加することにした場合、Node をまったく変更する必要はありません :)

お役に立てれば!

于 2012-11-16T21:34:10.863 に答える
0

あなたはすでに通常のリストデザインから逸脱しています-Nodeクラスから派生する代わりにテンプレートを使用することをお勧めします。次にforeach、この場合は各ノードで操作を実行するメソッドが必要になりますprint。このすべてを「生」でコーディングするのではなく、C++標準ライブラリコンテナを使用することを強くお勧めします。

別のオプション(標準性が低く、設計上の欠陥がある)はPrintList、関数を呼び出すaを導出することです。コンパイラーはこの関数を期待するためPrint、テンプレート化するか、ノードに関して実行する必要があります。Term

于 2012-11-16T20:52:12.180 に答える
0

3 つの選択肢:-

現実の世界では、std::listまたは同様のコンテナ クラスを使用します。

または、Print() を仮想メソッドとして Node に追加できます (潜在的に抽象化します)。

class Node {
  ...
  virtual void Print() = 0;
}

または、Node* を Term* にキャストすることもできます

    Term *t = boost::polymorphic_cast<Term*>(walker);
    t->Print();
于 2012-11-16T21:32:31.523 に答える