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

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

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


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 25 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

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

Есть класс контейнера, назовём его 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
Сообщений: 14,683
Репутация: 2631
По умолчанию

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

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

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

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

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

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

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

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

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

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

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

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

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

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

icq: 512-765
skype: alexp.frl
По умолчанию

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

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

Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не работает функция которая должна с 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 Паскаль 1 27.12.2010 09:39
Рекурсивная фунция в Паскале bwitcher Помощь студентам 10 13.12.2010 18:51


21:34.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.