3

多項式を表すLinkedListの実装を作成しようとしています。リンクリストは「用語」のリストになります。用語は、Dataの実装です(これは、メソッドcompareTo()およびtoString()を持つ抽象クラスです)。Polynomialクラスには、Termとして初期化しようとしているheadという変数があります。私のコンパイラは「抽象型のメンバーを宣言できない:Term」と言っていますが、TermはData(抽象クラ​​ス)の実装であるため、抽象的だとは思いませんでした。皆さんがこれを見て、私が見逃している巨大な赤い旗を教えていただければ幸いです。Collection.h:

  class Data {
  public:
  virtual ~Data() {}

virtual int compareTo(Data * other) const = 0;

virtual string toString() const = 0;
};

class Term : public Data { 
public:
int coefficient;
string variable1;
int exponentX;
string variable2;
int exponentY;
Term * next;

Term(int coeff, string var1, int exp1, string var2, int exp2, Term * next) : 
    coefficient(coeff), 
    variable1(var1),
    exponentX(exp1),
    variable2(var2),
    exponentY(exp2),
    next(next) {};

string convertInt(int number) {
    stringstream ss;//create a stringstream
    ss << number;//add number to the stream
    return ss.str();//return a string with the contents of the stream
}

int compareTo(Term * term) {
    if(this->exponentX > term->exponentX) {
    return 1;
    }
    else if(this->exponentX < term->exponentX) {
    return -1;
    }
    else {
        if(this->exponentY > term->exponentY) {
        return 1;
        }
        else if(this->exponentY < term->exponentY) {
        return - 1;
        }
        else {
        return 0;
        }
    }
}
string toString() {
    stringstream s;
    int * current = &this->coefficient;
    if(*current == 1 || *current == -1) {
    }
    else if(coefficient != 0) {
    s << convertInt(coefficient);
    }
    else { return s.str(); }
    if(variable1 != "" && this->exponentX != 0) {
    s << variable1;
    s << convertInt(exponentX);
    }
    if(variable2 != "" && this->exponentY != 0) {
    s << variable2;
    s << convertInt(exponentY);
    }
return s.str();
}   
};

また、LinkedListの実装もここにあります。そこには他にもいくつかの方法がありますが、問題はないようです。

LinkedList.cpp:

 class Polynomial : public LinkedList { 
public:
Term head;

Polynomial() {
this->head = NULL;
}

~Polynomial() {
Term * current = head;
    while (current != NULL) {
        Term * next = current->next;
        delete current;
        current = next;
    }
}

ありがとうございました!

4

1 に答える 1

6

仮想メソッドをオーバーライドする場合は、関数のシグネチャを正確に一致させる必要があります。リターンタイプは共分散ルールに従って変化する可能性がありますが、パラメータータイプは完全に同じである必要があります。

基本クラスでは、Data関数compareToは次のように宣言されます。

virtual int compareTo(Data * other) const

派生クラスTermでは、次のように宣言されます

int compareTo(Term * term)

まず、パラメータの種類が異なります。第二に、constが欠落しています。

これは、派生クラスに完全に無関係な関数を記述したことを意味します。基本クラスの純粋仮想関数をオーバーライドしません。基本の純粋仮想関数はオーバーライドされないままなので、クラスTermは依然として抽象的です。

Termあなたはあなたの機能を正確に次のように宣言しなければなりません

int compareTo(Data * other) const

私はあなたが比較のためだけに使用することを期待していると思いますcompareTo。ただし、この設計では、引数として受け取り、それをにキャストするか、ダブルディスパッチ手法を使用する必要があります。TermTermTermDataTerm

PSその上で、Termオブジェクトをクラスのメンバーとしてhead宣言しPolynomial、後でそれをポインターであるかのように使用します

Term * current = head;

これはまったく意味がありません。自分をポインタにしたい場合はhead、それをポインタとして宣言します。オブジェクトにしたい場合は、ポインタとしての使用をやめてください。これまたはあれのどちらか。

于 2012-07-15T22:36:13.200 に答える