0

私はC++を使用したパラメーターのオーバーロードを使用してこれを達成しようとしています:

Complex c(3.0, 4.0);
double magnitude = | c; // magnitude will be 5

私は次のコードを書きました:(ここに必要な部分だけ..)

class Complex
{
   public:
       double _real;
       double _imaginary;

       friend double operator|(const Complex &c1)
       {
           return sqrt(c1._real * c1._real + c1._imaginary * c1._imaginary);
       }
}

しかし、次のエラーが発生します。

error C2805: binary 'operator |' has too few parameters

operator |1つのパラメータだけで使用することは不可能ですか?

4

5 に答える 5

7
friend double operator|(const Complex &c1)
{
    return sqrt(c1._real * c1._real + c1._imaginary * c1._imaginary);
}

これはメンバー演算子を定義するのではなく、参考までに定義します。

double magnitude = | c;

これは無効な構文で|あり、二項演算子です。

正しい方法:

class Complex
{
   public:
       double _real;
       double _imaginary;

       double getMagnitude() const // POP POP!
       {
           return sqrt(_real * _real + _imaginary * _imaginary);
       }
}

これ以上のボーナスはありません。

于 2012-05-29T09:48:01.993 に答える
5

|1つのパラメーターだけで演算子を使用することは不可能ですか?

関係する型の少なくとも1つがユーザー定義型である限り、演算子をオーバーロードできますが、使用できるパラメーターの数によって動作を変更することはできません
エラーメッセージが|二項演算子であることを示しているので、単項演算子として機能するようにオーバーロードすることはできません。

これを行う正しい方法は何ですか?

クラスにユーティリティ関数を提供し、Complex適切な名前を付ける必要があります。そうすれば、可能な限り最善の方法で仕事をすることができます。

演算子のオーバーロードの非常に基本的なルールは次のとおりです。
「演算子の意味が明確で議論の余地がない場合は、オーバーロードしないでください。代わりに、適切に選択された名前で関数を提供してください。」
このルールは、このような直感的でない演算子の使用を対象としています。

于 2012-05-29T09:47:54.107 に答える
0

オペレーター| 二項演算子です。二項演算子として、2つのパラメーターが必要です。ここでやりたいことをやりたい場合は、単項演算子を使用する必要があります。

とにかく-それが何をするかを見るためにオペレーターを見ることから明らかではないので、それは悪い考えのように見えます。

于 2012-05-29T09:49:40.210 に答える
0

いいえ-'|' 演算子は二項演算子です。つまり、2つのパラメーターを取ります。演算子をオーバーロードすることはできますが、その「アリティ」を変更することはできません。ただし、一部のオペレーターは複数のアリティで利用できます。

単項演算子には次のものがあります。

  • +
  • -
  • ++(前バージョンと後バージョンの両方)
  • -(前バージョンと後バージョンの両方)
  • *
  • (キャスト)(ただし、二重の結果を得るには、適切なキャストタイプを定義する必要があります)

ソフトウェアエンジニアリングの観点からの最良の解決策は、おそらく、モジュラスを取得するための明示的なメソッドです(たとえば、getModulus())。しかし、あなたは合法的にダブルキャストは大丈夫だと主張することができます。

後者の場合、次のようになります。

class Complex
{
   public:
       double _real;
       double _imaginary;

       operator double() const
       {
           return sqrt(this._real * this._real + this._imaginary * this._imaginary);
       }
}

次のように使用します。

Complex c(3.0, 4.0);
double magnitude = c; // magnitude will be 5
于 2012-05-29T09:52:37.577 に答える
-1

演算子を使用することは不可能ですか| パラメータが1つだけですか?

はい。オペレーター| 二項演算子です。つまり、2つの引数を取るということです。あなたが探しているのは演算子です|=

struct wtf
{
    double operator|= (double omg)
    {  
        return 42.;
    }
};

int main(){ wtf omg; omg|=  42.; }
于 2012-05-29T09:51:46.097 に答える