Member 13540005 Ответов: 2

Использование функции-члена const


Мы с моим другом работаем над классом под названием rectangle.
У нас есть функция-член, которая возвращает квадрат (объект нашего класса)
площади, эквивалентной средней площади в 2 квадрата.
Итак (площадь квадрата 1 + площадь квадрата 2)/ 2
сторона возвращенного квадрата должна быть округлена до ближайших. Мы работали над этим и после отладки поняли, что const в конце нашей функции мешает нам изменять значения.
Надеюсь, я предоставил достаточно информации.
Мой вопрос заключается в том, каким должен быть наш подход, если мы не можем изменять значения внутри этой функции? обратите внимание, что мы не должны создавать новые функции, просто кодируя реализацию класса. Кроме того, есть и другие функции, но я показываю их только потому, что они больше всего относятся к моему вопросу, а остальные, похоже, в порядке.

class square
{
public: 
    square(int s);
    int plus(square sq) const;
    square avgSquare(square sq) const; // this the function we are trying to fix
    ~square(); // default constructor
 
private:
    int side;
};
 
//_________class implementation below___________

// parameterized constructor with default parameter 

square::square(int s=0) 
{
    side = s;
}

// the function below seems fine( area is another function that works)

int square::plus(square sq) const
{
    int plus = sq.area() + sq.area();
    int area1 = sq.area();
    int area2 = sq.area();
    plus = area1 + area2;
    return plus;
}
 
//ok folks so below is the function we are trying to fix.
//I have written how we filled it in the "what have you tried" section

square square::avgSquare(square sq) const
{
}


Что я уже пробовал:

сначала мы закодировали, как получить среднее значение. И тут есть небольшое разногласие. Я покажу два способа, которыми, по нашему мнению, это должно быть сделано. Но мы не знали об ограничениях, наложенных на нас const

square square::avgSquare(square sq) const
{
    //way one
    double Asq = round(plus(sq)/2);
    return Asq;
    //way two
    double Asq = round(sq.plus()/2);
    return Asq;
  
    return sq.plus()/2;
}

2 Ответов

Рейтинг:
1

Rick York

Вы пробовали это скомпилировать? Второй способ не будет компилироваться, потому что вы не передали ему аргумент.

Существует несколько различных способов реализации avgSquare. Вот один из способов, как статический метод.

static double square::avgSquare( square & s1, square & s2 )
{
    int areasum = s1.area() + s2.area();
    double asq = areasum / 2.0;
    return asq;
}


Рейтинг:
1

Jochen Arndt

Если вы можете сделать функцию const, вы должны это сделать. Вы также должны передавать параметры, которые не являются базовыми типами, по ссылке const, если они не изменяются, вместо того чтобы передавать их по значению.

Но есть проблема с вашим примером:
Функция avgSquare определяется как возврат square но ваша реализация возвращает a double или int.

Возможным решением может быть:

// Implementation for this function not shown
int area() const;

int avgSquare(const square& s1, const square& s2) const
{
    return (s1.area() + s2.area()) / 2;
}

// An optional additional implementation
int avgSquare(const square& other) const
{
    return avgSquare(*this, other);
}
Если вам нужно возвращать double просто разделите на 2,0:
double avgSquare(const square& s1, const square& s2) const
{
    return (s1.area() + s2.area()) / 2.0;
}

Существует всего несколько простых операций, так что нет необходимости использовать другие функции-члены, такие как plus().