2012-05-21 2 views
0

Хорошо, что название в значительной степени говорит об этом. Я опубликовал часть своего кода, я понятия не имею, как добавить 1 к сторонам треугольника (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 *) это + 1' в данном написании Triangle & треугольника :: оператор ++() ...

Редактировать : Известно, что C++ жарит мозги, но это что-то еще нужно выяснить из первых рук. 10x каждый.

+1

Вам необходимо реализовать оператор + –

+0

http://courses.cms.caltech.edu/cs11/material/cpp/donnie/cpp-ops.html –

+1

Урок, который можно извлечь из этого опыта, состоит в том, что сообщения об ошибках обычно справедливы информативны, но иногда вам придется на некоторое время и подумать о них. – dmckee

ответ

4

Вам нужно будет либо перегружать operator+ с Triangle и int или изменить operator++ логику для работы непосредственно на сторонах *this объекта

В любом случае логика что-то вроде этого (для ++):

sides[0]++; 
sides[1]++; 
sides[2]++; 
-1

Вам не нужна перегруженная функция, которая принимает параметр. Компилятор будет рассматривать этот код как объект Triangle ++ ++ Triangle. В вашем, который не принимает параметров, добавьте код выше, чтобы изменить каждую сторону. После выполнения компилятором вы увидите оператор ++ с треугольным объектом слева, чтобы выполнить свой код. Надеюсь это поможет.

+2

Перегруженный оператор ++ с параметром необходим. Это постфиксный оператор ++, за исключением того, что он неправильно реализован в коде OP. Фактически, он должен возвращать треугольник по значению. – juanchopanza

1

Есть несколько проблем с кодом:

  • Ваш прирост постфикса не возвращает старое значение. Код должен придерживаться ожидаемого поведения данного оператора.
  • Вам необходимо реализовать копирование, чтобы правильно реализовать семантику приращения postfix.
  • У вас нет операторов вставки/удаления потока треугольника, поэтому ваш код не будет компилироваться.

Попробуйте что-то вроде этого:

#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++ -std=c++0x foo.cpp 
$ ./a.out 
(1, 2, 3) 
(1, 2, 3) 
(3, 4, 5) 

HTH!

1

Другие уже дали хорошие ответы, в которых показано, как исправить это и указать другие проблемы в вашем коде, это более общий ответ об ошибке.

ошибка точек сообщений в этой строке:

*this = *this + 1; 

Это говорит о том, что нет operator+ определено разрешить эту операцию сложения.

Как сказал комментатор, вам нужно действительно прочитать сообщение об ошибке и подумать о том, что он говорит.

Компилятор прав, вы не определили этот оператор, поэтому, конечно, эта строка не будет компилироваться. Вы ожидали этого? Вы также ожидаете, что сможете умножить свой тип на 10? Или разделите его на 2? Что означают эти операции для вашего типа? Как компилятор знает, что делать?

Если компилятор сообщает вам, что нет оператора, который допускает это выражение, это означает, что вы не указали оператор, который соответствует типам аргументов.

Смежные вопросы