2

先日、クラスメンバー関数を使用して2パラメータ演算子をオーバーロードしようとしたときに問題が発生しました。参照してみましたが、何も変わりませんでした。コンパイラは、クラス自体と同じ型の複数の引数を取るメンバー関数を記述できないと言いました。何故ですか?

コードは次のとおりです。

class Fraction
{
public:
  Fraction(int num=1, int den=1): numerator(num), denominator(den) {}
  Fraction(const Fraction& r): numerator(r.numerator), denominator(r.denominator) {}
  Fraction& operator=(const Fraction&);
  Fraction& operator*(const Fraction&, const Fraction&);
private:
  int numerator, denominator;
};

Fraction& Fraction::operator=(const Fraction& r)
{
  numerator = r.numerator;
  denominator = r.denominator;
  return *this;
}

Fraction Fraction::operator*(const Fraction& x, const Fraction& y)
{
  Fraction z(x.numerator*y.numerator, x.denominator*y.denominator);
  return z;
}

コンパイラからのエラー メッセージは次のとおりです。

Fraction& Fraction::operator*(const Fraction&, const Fraction&)' must take either zero or one argument

4

2 に答える 2

1

まず、あなたが観察している問題は、一般的なメンバー関数とはまったく関係ありません。メンバー関数は通常、「同じクラス」型の任意の数の引数を取ることができます。あなたの例では、宣言することができます

class Fraction
{
   void foo(Fraction &f1, Fraction &f2, Fraction &f3, Fraction &f4) {}
   ...
};

問題なく。したがって、メンバー関数全般に関する質問であるかのように質問することにした理由は明確ではありません。

第二に、あなたのコードでは、operatorをオーバーロードしようとしているという単純な事実についてです。C++ の演算子構文は、ほとんどの (すべてではない) 演算子に対して固定されています。これは、構文が固定されている演算子のパラメーター数が固定されていることを意味します。

あなたの例では、それは operator*です。単項 (1 つのパラメーター) または 2 進数 (2 つのパラメーター) にすることができます。メンバー関数によってこの演算子をオーバーロードすると、1 つのパラメーターが既に暗示されているため、0 または 1 つの追加パラメーターのみを追加できます (それぞれ単項*およびバイナリの場合*)。一方、暗黙的なパラメーターに加えて、さらに2 つのパラメーターを追加しようとしています。つまり、三項演算子を定義しようとしています*。これは不可能です。*C++ には三項演算子はありません。そして、これはまさにコンパイラがあなたに伝えていることです。

于 2013-06-05T20:18:39.397 に答える