0

まあ、タイトルはほとんどそれを言っています。コードの一部を投稿しましたが、三角形 (a、b、c) の辺に 1 を追加する方法がわかりません...どんな助けも大歓迎です!

class Triangle
{
public:
    Triangle();
    Triangle(double a, double b, double c);
    ~Triangle();
    double get_side_a() const;
    double get_side_b() const;
    double get_side_c() const;
    Triangle& operator++();
    void operator++(int dummy);
private:
    double* sides;
};

Triangle::Triangle()
{
    sides = new double[3];
    sides[0] = 0;
    sides[1] = 0;
    sides[2] = 0;
} // Constructor

Triangle::Triangle(double a, double b, double c)
{
    sides = new double[3];
    sides[0] = a;
    sides[1] = b;
    sides[2] = c;
} // Constructor with parameters

Triangle::~Triangle()
{
    if(sides)
    {
        delete[] sides;
        sides = 0;
    }
} // Destructor

double Triangle::get_side_a() const
{
    return sides[0];
} // get_side_a

double Triangle::get_side_b() const
{
    return sides[1];
} // get_side_b

double Triangle::get_side_c() const
{
    return sides[2];
} // get_side_c

Triangle& Triangle::operator++()
{
    *this = *this + 1;
    return *this;
} // Oprator ++ (prefix)

void Triangle::operator++(int dummy)
{
    ++(*this);
} // Operator ++ (postfix)

int main()
{
    Triangle tri1, tri2;

    cout << "Enter side legths for triangle 1:" << endl;
    cin >> tri1;
    cout << endl << "Enter side legths for triangle 2:" << endl;
    cin >> tri2;

    cout << endl;
    cout << tri1 << endl;
    cout << tri2 << endl;

    return 0;
}

エラーが表示されます: '*(Triangle*)this + 1' の 'operator+' に一致しません。この特定の Triangle& Triangle::operator++() の記述では...

編集: C++ が脳みそを揚げることは知られていますが、直接調べなければならないことは他にもあります。全員10倍。

4

4 に答える 4

4

オブジェクトの側面で直接動作するようにロジックをオーバーロードするか、ロジックを変更する必要がoperator+ありますTriangleintoperator++*this

どちらの場合も、ロジックは次のようになります (の場合++):

sides[0]++;
sides[1]++;
sides[2]++;
于 2012-05-21T17:33:46.783 に答える
1

他の人はすでにそれを修正する方法を示し、あなたのコードの他の問題を示す良い答えを出しました、これはエラーメッセージについてのより一般的な答えです。

エラーメッセージは次の行を示しています。

*this = *this + 1;

これはoperator+、その加算操作を許可するように定義されていないことを示しています。

コメント投稿者が言ったように、あなたは実際にエラーメッセージを読んでそれが何を言っているかを考える必要があります。

コンパイラは正しいです。その演算子を定義していないので、もちろんその行はコンパイルされません。あなたはそれを期待しましたか?また、タイプに10を掛けることができると期待していますか?またはそれを2で割りますか?それらの操作はあなたのタイプにとってどのような意味がありますか?コンパイラはどのようにして何をすべきかを知るのでしょうか?

コンパイラがその式を許可する演算子がないと言った場合、それは引数の型に一致する演算子を記述していないことを意味します。

于 2012-05-21T20:18:49.283 に答える
1

コードにはいくつかの問題があります。

  • 後置インクリメントは古い値を返しません。コードは、特定の演算子の予想される動作に準拠する必要があります。
  • 後置インクリメント セマンティクスを正しく実装するには、コピーを実装する必要があります。
  • Triangle ストリームの挿入/抽出演算子がないため、コードがコンパイルされません。

次のようなことを試してください:

#include <iostream>
#include <vector>

class Triangle
{
public:
    Triangle() : sides(3) {}
    Triangle(double a, double b, double c) : sides({a, b, c }) {}
    Triangle(Triangle const & other) : sides(other.sides) {}
    ~Triangle() {}
    void operator=(Triangle other) { sides.swap(other.sides); }
    double get_side_a() const { return sides[0]; }
    double get_side_b() const { return sides[1]; }
    double get_side_c() const { return sides[2]; }

    Triangle & operator++()
    {
        for (auto & side : sides)
            ++side;

        return *this;
    }

    Triangle operator++(int)
    {
        Triangle tmp(*this);
        ++(*this);
        return tmp;
    }

private:
    std::vector<double> sides;
};

std::ostream & operator<< (std::ostream & o, Triangle const & t)
{
    o << '('
      << t.get_side_a() << ", "
      << t.get_side_b() << ", "
      << t.get_side_c() << ')';

    return o;
}

int main()
{
    using namespace std;

    Triangle t(1, 2, 3);
    cout << t << endl;

    Triangle t1 = t++;  // (1, 2, 3) - old value returned
    cout << t1 << endl;

    Triangle t2 = ++t;  // (2, 3, 4) + (1, 1, 1) = (3, 4, 5)
    cout << t2 << endl;
}

g++ でのコンパイルと実行:

$ g++ -std=c++0x foo.cpp
$ ./a.out
(1, 2, 3)
(1, 2, 3)
(3, 4, 5)

チッ!

于 2012-05-21T18:15:31.997 に答える
-1

パラメータを取るオーバーロードされた関数は必要ありません。コンパイラは、そのコードをTriangleオブジェクト++Triangleオブジェクトと見なします。パラメータをとらないものでは、上記のコードを追加してそれぞれの側を変更します。実行すると、コンパイラは、コードを実行するために左側に三角形のオブジェクトを持つ++演算子を表示します。お役に立てれば。

于 2012-05-21T18:00:26.317 に答える