0

好吧,标题几乎说明了这一点。我已经发布了我的代码的一部分,我不知道如何将 1 添加到三角形的边(a、b 和 c)......任何帮助将不胜感激!

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& 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

您的代码存在一些问题:

  • 您的后缀增量不会返回旧值。代码应该遵守给定操作员的预期行为。
  • 您需要实现复制以正确实现后缀增量语义。
  • 您没有三角形流插入/提取运算符,这就是您的代码无法编译的原因。

尝试这样的事情:

#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 回答