Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

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

Есть класс контейнера, назовём его 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 в 06:39.
taras-proger77 вне форума Ответить с цитированием
Старый 17.04.2019, 07:36   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

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

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

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

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

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

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

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

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

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

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

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

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

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

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

А член-то тут причем вообще? Что-то поменяется если она не членом будет? (как многие функции STL)
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 17.04.2019, 14:40   #10
taras-proger77
Заблокирован
 
Регистрация: 17.12.2018
Сообщений: 514
По умолчанию

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


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


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