1

重複の可能性:
演算子のオーバーロード

私がやりたいのは、多項式で定数を追加する演算子をオーバーロードすることです。これがクラス定義です。

class polynomial
{
public:
    polynomial();// default constructor
    polynomial(double*,int);//  parameterized constructor
    polynomial(polynomial*);// copy constructor
    ~polynomial();//destructor
    polynomial* const operator+(polynomial*);
    polynomial* const operator+(double);
    friend polynomial* const operator+(double,polynomial);
    polynomial* operator-(polynomial*);
    polynomial* operator-(const double);
    polynomial* operator*(polynomial*);
    polynomial* polynomial::operator*(const double);
    friend ostream& operator<<(ostream&,polynomial*);
    friend double evaluate(polynomial*,double);
    friend double* extract(polynomial*);
    polynomial* operator =(polynomial*);
    int degree;
private:
    double* polyNum;
};

組み込みクラスの定義にアクセスして、メンバー関数として必要な演算子を追加できないためです。非メンバー関数しかありません。しかし、そうしようとすると、「..'operator +' must have a least one form parameter of class type..」というエラーが表示されます。

    friend polynomial* const operator+(double,polynomial*);

ただし、オブジェクトのポインターの代わりにオブジェクトを渡そうとすると、他の関数から戻るときに自動的にデストラクタが呼び出され、オブジェクト内のポインターが指すすべてのデータが消去されるという別の問題があります。

    polynomial* const operator+(double constant,polynomial p)
{
->  return p+constant;
}

  • p {degree=3 polyNum=0x00de8188 {1.0000000000000000} } 多項式

polynomial* const operator+(double constant,polynomial p)
{
    return p+constant;
->
}

  • p {度=3 polyNum=0x00de8188 {-2.6569842580370804e+303} } 多項式
4

2 に答える 2

0

あなたはポインタの必要性について混乱しているようです。(ヒント:クラスにポインターは必要ありません。)

特定の質問に答えるには、operator+関数は次のようになります。

class polynomial {
public:
  polynomial& operator +=(double d) {
     polynum[0] += d; // or whatever
     return *this;
  }
  polynomial& operator+=(const polynomial& p) {
    for( ... ) {
      polynum[i] += p.polynum[i]; // or whatever
    }
    return *this;
  }

  // other stuff goes here, too
  ...
};

polynomial operator+(polynomial p, double d) { return p += d; }

polynomial operator+(double d, polynomial p) { return p += d; }

polynomial operator+(polynomial l, const polynomial& r) { return l += r; }

一般的な使用法は次のとおりです。

int main () {
  polynomial p, q, r;
  double d;
  ... fill in p, q, and d ...
  q = p + d;
  r = d + p;
  p = q + r;
}
于 2012-11-28T04:04:26.740 に答える
0

私が以前に持っていた唯一のコピーコンストラクターは

polynomial(polynomial*);
// copy constructor work with pointer

ポインターではなくオブジェクトを引数として関数に渡すと、それが行われます

 polynomial* const operator+(double constant,polynomial p)
{
    return p+constant;
}

ローカル変数は、p.polynum の値を含め、外部変数から値をコピーするだけです。その結果、1 つの同じ配列を指す 2 つのポインターが存在します。関数が終了して戻る準備ができたら、デストラクタを呼び出してローカル変数 p を破棄します。これにより、p.polynum の配列が破棄されます。そのため、外部ポインタが指している配列内の値が消去されます。そのため、ポインターを含むクラスには実際のコピー コンストラクターが必要です。

解決:

追加のコピー コンストラクターを次のように追加します。

polynomial(polynomial*);
// copy constructor2 work with object.
于 2012-11-29T02:13:47.750 に答える