Форум программистов
 
О проблемах, например, с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Вернуться   Форум программистов > C++ > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Ответ
 
Опции темы
Старый 17.04.2019, 07:26   #1
taras-proger77
Форумчанин
 
Регистрация: 17.12.2018
Сообщений: 419
По умолчанию Что должна возвращать фунция-член?

Есть класс контейнера, назовём его TList и класс его элемента, назовём его TItem. В классе TList есть функция-член Find, принимающая некий параметр и ищет элемент, у которого значение определённого члена (всегда одного) равно значению параметра. Если элемент найден, то всё просто: можно вернуть ссылку на найденный элемент. А что делать, если элемент не найден? Нельзя же возвращать как ссылку *nullptr? Указатель тоже возвращать не охота. Во-первых const Item* – это указатель на const Item, но сам указатель – не константа. К нему можно применить инкремент, или декремент, можно выполнить
Код:
p=Find(v)+60;
, или
Код:
p=Find(v)-130;
, можно присвоить другому указателю сумму или разность с данным указателем. А во-вторых неохота функции-члены TItem декларировать как const, а на самом деле менять в них значения членов *this. Хотелось бы, наоборот, константой сделать сам указатель и запретить его использование в выражениях арифметики указателей и в качестве операнда delete и placement new, Но чтоб указывал он не на const TItem, а на TItem. Или ссылку вернуть, но так, чтоб она, подобно указателю, могла быть фактически вникуда. И чтоб можно было ещё проверить такую ссылку. Желательно проверку инкапсулировать в каждое обращение.

Последний раз редактировалось taras-proger77; 17.04.2019 в 07:39.
taras-proger77 вне форума Ответить с цитированием
Старый 17.04.2019, 08:36   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,103
По умолчанию

Цитата:
Сообщение от taras-proger77 Посмотреть сообщение
А что делать, если элемент не найден?
TList::end iterator
p51x вне форума Ответить с цитированием
Старый 17.04.2019, 08:50   #3
taras-proger77
Форумчанин
 
Регистрация: 17.12.2018
Сообщений: 419
По умолчанию

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

Последний раз редактировалось taras-proger77; 17.04.2019 в 08:55.
taras-proger77 вне форума Ответить с цитированием
Старый 17.04.2019, 09:16   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,103
По умолчанию

Цитата:
Сообщение от taras-proger77 Посмотреть сообщение
Доступ по элементу к его соседям должен быть запрещён в любом случае. Независимо от того, найден элемент, или нет.
Поле нест сделайте приватным.

Цитата:
Сообщение от taras-proger77 Посмотреть сообщение
Список – это только внутреннее представление совокупности данных, внешнего интерфейса списка здесь нет и быть не должно.
Ну так и не называйте его так. Возвращайте
Код:
std::optional
, например.
p51x вне форума Ответить с цитированием
Старый 17.04.2019, 09:21   #5
taras-proger77
Форумчанин
 
Регистрация: 17.12.2018
Сообщений: 419
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Возвращайте
Цитата:
std:ptional
, например.
А что это?
taras-proger77 вне форума Ответить с цитированием
Старый 17.04.2019, 09:22   #6
taras-proger77
Форумчанин
 
Регистрация: 17.12.2018
Сообщений: 419
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Поле нест сделайте приватным.
Что такое нест?
taras-proger77 вне форума Ответить с цитированием
Старый 17.04.2019, 09:33   #7
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,103
По умолчанию

Цитата:
Сообщение от taras-proger77 Посмотреть сообщение
А что это?
https://en.cppreference.com/w/cpp/utility/optional

Цитата:
Сообщение от taras-proger77 Посмотреть сообщение
Что такое нест?
Некст, один из указатель в списке.
p51x вне форума Ответить с цитированием
Старый 17.04.2019, 12:19   #8
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от taras-proger77 Посмотреть сообщение
Есть класс контейнера, назовём его TList и класс его элемента, назовём его TItem. В классе TList есть функция-член Find
хороший вариант:
вернуть итератор (итератор может быть end)

плохой вариант:
вернуть указатель (указатель может быть nullptr)

для извращенцев:
можно использовать std:ptional, etc.

для дебилов:
в случае успеха можно можно возвращать ссылку.
в случае провала - кидать эксепшен.

для настоящих ценителей:
в случае успеха можно можно возвращать ссылку.
в случае провала можно - ссылку на объект-заглушку.
_Bers вне форума Ответить с цитированием
Старый 17.04.2019, 12:31   #9
Alex11223
Заблокирован
 
Регистрация: 12.01.2011
Сообщений: 19,504
По умолчанию

А член-то тут причем вообще? Что-то поменяется если она не членом будет? (как многие функции STL)
Alex11223 вне форума Ответить с цитированием
Старый 17.04.2019, 15:40   #10
taras-proger77
Форумчанин
 
Регистрация: 17.12.2018
Сообщений: 419
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
А член-то тут причем вообще? Что-то поменяется если она не членом будет? (как многие функции STL)
Конечно. Если она не будет членом, то не получит доступа к private-членам.
taras-proger77 вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не работает функция которая должна с json формата возвращать в стандартный dimaSlon Qt и кроссплатформенное программирование С/С++ 76 08.06.2018 18:35
Дан первый член и разность арифметической прогрессии, найти член прогрессии с номером n nomin Помощь студентам 2 06.12.2014 17:43
Фунция для подсчета повторяющихся значений Brucebelg Microsoft Office Excel 7 08.08.2012 14:33
поменять местами наибольший член и член с номером m Zhasik Паскаль, Turbo Pascal, PascalABC.NET 1 27.12.2010 09:39
Рекурсивная фунция в Паскале bwitcher Помощь студентам 10 13.12.2010 18:51


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS