0

行を表すクラスを作成し、aX + bY = c オーバーロード演算子で行を高くしたかっ+た(より高い行を返すので、以下でそれを実行しましたが、コンパイラーは言いますinvalid use of this

class Linia{
public:
    double a,b,c;
    Linia (double a, double b, double c){
        this->a = a;
        this->b = b;
        this->c = c;
    }
   friend Linia operator+ (double i){
   return new Linia(a, this->b, this->c + i/this->b);
}
};

上記のLiniaようなフィールドを持つ新しいオブジェクトを返したいのですが、元のオブジェクトを変更したくないのですiint

4

4 に答える 4

5

基本的な構文の問題がいくつかあります。

  • thisはポインタなので、逆参照するために使用する必要があります->

  • 私はあなたがthis->c + i.c代わりに意味すると思いますthis->c + i

  • オペレーターを友達にする必要はありません(おそらくそうすべきではありません)。

  • (のような)新しいインスタンスを返す演算子はoperator+、ヒープに割り当てるのではなく、値で返す必要があります。

  • 演算子は通常、パラメーターをconst参照として受け取ります(オペランドを変更するべきではないため)。

私はあなたがこのようなものを持っていることを意味すると思います:

class Linia{
public:
    double a,b,c;
    Linia (double a, double b, double c){
        this->a = a;
        this->b = b;
        this->c = c;
    }
    Linia operator+ (const Linia& i){
        return Linia(this->a, this->b, this->c + i.c / this->b);
    }
};

これをクリーンアップして次のようにすることができます。

class Linia{
public:
    double a,b,c;
    Linia (double a, double b, double c)
        : a(a), b(b), c(c)
    { }

    Linia operator+ (const Linia& i){
        return Linia(a, b, c + i.c / b);
    }
};
于 2013-01-30T17:45:17.543 に答える
1

yourが2つのsを入力として受け取り、係数が追加されたものを返すoperator+2項演算子であるとすると、次のように、入力sの適切な定数の正確さを使用して自由関数のオーバーロードを定義できます。LiniaLineaoperator+Linia

Linia operator+(const Linia& lhs, const Linia& rhs)
{
    return Linia
    (
        lhs.a + rhs.a,
        lhs.b + rhs.b,
        lhs.c + rhs.c
    );
}
于 2013-01-30T17:47:42.663 に答える
1

として宣言したためfriend、加算演算子はメンバー関数ではないため、2つのパラメーターを受け取る必要があり、this:にアクセスできません。

friend Linia operator+ (const Linia& lhs, const Linia& rhs)
{
  return Linia(lhs.a, lhs.b, lhs.c + rhs/lhs.b);
}

これはコードのロジックに従いますが、演算子がある場合にのみ機能しますdouble operator/(const Linia& lhs, double)。直感的に意味のあるものは

friend Linia operator+ (const Linia& lhs, const Linia& rhs)
{
  return Linia(lhs.a+rhs.a, lhs.b+rhs.b, lhs.c + rhs.c);
}

最後に、friend宣言を完全に回避して、演算子を標準の非メンバー関数として宣言することができます。プライベートデータや保護されたデータにはアクセスしないため、友達である必要はありません。

于 2013-01-30T17:48:24.160 に答える
1

コードには少なくとも2つの問題があります。まず、あなたはoperator+友達であると宣言したので、それは無料の関数であり、はありませんthis。残念ながら、コードからは、あなたが何をしようとしているのか(単項+のオーバーロードまたはバイナリ+のオーバーロード)を理解できないため、これ以上言うのは難しいです。new次に、オブジェクトタイプではなくポインタである の結果を返そうとしています。operator+常にオブジェクトタイプを返す必要があるため、は必要ありませんnew

于 2013-01-30T17:46:14.270 に答える