0

多項式クラスでの高レベル ADT の使用を理解できません。私が与えられたのは

typedef struct term{
  double coef; 
  unsigned deg; 
  struct term * next;
}term_t;
typedef struct term * Term;
typedef struct term * Poly;

これは低レベルの ADT と言われていますが、高レベルの ADT を使用する必要があるため、クラスを作成する必要があります。私がやり始めているのは

class Polynomial{
private:
    typedef struct term{
        double coef;
        unsigned deg;
        struct term * next;
    }term_t;
    typedef struct term *Term;
    typedef struct term *Poly;
public:
    Polynomial(); //Constructor
    ~Polynomial(); //Destructor     
}

私の問題は、低レベルからADT、高レベルADTへの変化を控えめに表現することです。関数はプライベートにする必要がありますが、パブリック関数を介してアクセスできますか? これは基本的に多項式連結リスト多項式クラスのようなものですか? 私のスタートは良いですか?term と poly は coef と deg へのポインタになりますか?

4

2 に答える 2

1

ADT は、そのデータに対して実行できる一連の操作を含むデータです。低レベルまたは「C」ADT は、データへのある種のハンドルを他の必須パラメーターとともに受け取り、それらが表す操作を実行する関数のコレクションとして実装されていることを認識します。

ただし、C++ では、操作を表す関数をクラス定義を介してデータ自体にバインドできるため、物事はより単純になります。

さて、あなたの例では、多項式で実行できる操作の種類について考えてみましょう。追加してみましょう:

C では、次のような関数を定義します。

Poly poly_add (Poly p1, Polyp2)
{
/*addition code be here*/
}

C++ でどのように行うのでしょうか?! メソッドをオブジェクトにバインドしたいので、次のようにします。

class Polynomial
{
  ....
public:
  Polynomial add(Polynomial& p2)
  {
    // addition code be here
  }
};

これは次のように呼び出されますp3 = p1.add(p2)

あなたの質問に答えるために、クラスに属するグローバル メソッドは「低レベル」構造体で直接操作できます。そのコードを配置したい場所です。

Polyまた、 andTermはポインターではなく型であることに注意してください。どちらもterm_t構造体を指すポインターの型です。

当然ながら、改善の余地はたくさんあります (つまり、二項演算をフレンド関数にすることができます。さらに良いことに、オーバーロードされた演算子を作成できます)。

于 2012-11-21T00:14:28.020 に答える
0

抽象データ型について考える方法は、データはそれが何から構成されているかではなく、何をするか (その署名) によって定義されるということです。実際、クラスを使用したからといって、実装が自動的に高レベルまたは低レベルになるわけではありません。次の場合、高レベルまたは低レベルです。

  1. ユーザーは、それを使用するために低レベルの操作をいじる必要はありません。
  2. ユーザーは、そのインターフェイス (ブラック ボックス) に関してのみクラスを使用します。

クラスを設計するときは、実装について何も知らない、または知りたくないユーザーの立場に立つ必要があります。ユーザーにとって、クラスは単にメソッドを呼び出すためのものであり、仕事を成し遂げます。作り方は謎です。

それをあなたの指針としましょう。実装の詳細は、それらを実現するために使用するものであり、ユーザーには公開されないため、ADT とは何の関係もありません。ADT はインターフェイスにあります。

適用できるより具体的なテストは、自分で使用してみて、レベルの高さを確認することです。多項式を使用する別のプログラムを作成し、クラスをインスタンス化して使用し、それが十分に高レベルであるかどうかを自問してください。適切なインターフェースが得られるまで、必要に応じて修正してください。

于 2012-11-21T00:07:20.203 に答える