Мой инструктор попросил нас найти 2 ошибки в этом разделе кода Бьярна Страуструпа из его книги C++.C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Мой инструктор попросил нас найти 2 ошибки в этом разделе кода Бьярна Страуструпа из его книги C++.

Сообщение Anonymous »

Сейчас я изучаю C++ 205, и часть задания, которое мой преподаватель дал нам на этой неделе, заключалось в том, чтобы найти две ошибки в этом разделе примера кода Бьярна Страуструпа, приведенного в разделе 16.2.10 его книги «Язык программирования C++». ".
Фрагмент кода такой:

Код: Выделить всё

Date& Date::add_year(int n) {
if (d == 29 && m == 2 && !leapyear(y + n)) { // beware of February 29
d = 1;
m = 3;
}
y += n;
return *this;
}
Я чувствую себя относительно компетентным в программировании на C++, но почти все в книге Бьярна выходит за рамки моего понимания, так что, возможно, я не так компетентен, как я думал. Он сказал, что ответы на самом деле просты, поэтому я не знаю, заморачиваюсь ли я или что, но, похоже, я ничего не могу придумать. Я прочитал весь раздел книги как минимум 10 раз. Если контекст раздела книг поможет, я также опубликую его ниже.
Ссылка на книгу здесь:
https ://chenweixiang.github.io/docs/The_C++_Programming_Language_4th_Edition_Bjarne_Stroustrup.pdf

16.2.10 Самостоятельная ссылка
Функции обновления состояния add_year(), add_month() и add_day() (§16.2.3) были определены так, чтобы не возвращать значения. Для такого набора связанных функций обновления часто бывает полезно вернуть ссылку на обновленный объект, чтобы операции можно было объединить в цепочку. Например, мы хотели бы написать:

Код: Выделить всё

void f(Date& d)
{
//...
d.add_day(1).add_month(1).add_year(1);
//...
}
чтобы добавить день, месяц и год к d. Для этого необходимо объявить каждую функцию, возвращающую ссылку на дату:

Код: Выделить всё

class Date {
//...
Section 16.2.10 Self-Reference 465
Date& add_year(int n); // add n years
Date& add_month(int n); // add n months
Date& add_day(int n); // add n days
};
Каждый (не) функция-член знает, для какого объекта она была
вызвана, и может явно ссылаться на него. Например:

Код: Выделить всё

Date& Date::add_year(int n) {
if (d==29 && m==2 && !leapyear(y+n)) { // beware of February 29
d = 1;
m = 3;
}
y += n;
return *this;
}
Выражение *this относится к объекту, для которого вызывается функция-член.
В не- функция-член, ключевое слово this является указателем на объект, для которого была вызвана функция. В не- функция-член класса X, ее тип — X*. Однако this считается значением r, поэтому невозможно взять адрес this или присвоить его. В функции-члене const класса X тип this — const X*, чтобы предотвратить изменение самого объекта (см. также §7.5).
Большинство случаев использования неявны. В частности, каждая ссылка на не-

Код: Выделить всё

staticЧлен 
внутри класса полагается на неявное использование этого для получения члена соответствующего объекта. Например, функцию add_year можно было бы эквивалентным образом, но утомительно, определить следующим образом:

Код: Выделить всё

Date& Date::add_year(int n) {
if (this−>d==29 && this−>m==2 && !leapyear(this−>y+n)) {
this−>d = 1;
this−>m = 3;
}
this−>y += n;
return *this;
}
Одно из распространенных явных применений этого — манипулирование связанными списками. Например:

Код: Выделить всё

struct Link {
Link* pre;
Link* suc;
int data;

Link* insert(int x) // insert x before this
{
return pre = new Link{pre,this,x};
}

void remove() // remove and destroy this
{
if (pre) pre−>suc = suc;
if (suc) suc−>pre = pre;
delete this;
}

//...
};
Явное использование этого требуется для доступа к членам базовых классов из производного класса, который является шаблоном (§26.3.7).

Единственное, что я мог придумать, это то, что что-то может быть не так с возвратом *this, думая, что могут возникнуть проблемы с его неявным, а не явным использованием для нестатической и неконстантной функции-члена, но, честно говоря, я здесь немного запутался.

Подробнее здесь: https://stackoverflow.com/questions/783 ... oustrups-c
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»