Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.85/55: Рейтинг темы: голосов - 55, средняя оценка - 4.85
1 / 1 / 1
Регистрация: 24.03.2013
Сообщений: 178

Что такое обертка функции?

19.09.2015, 00:28. Показов 12690. Ответов 40
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
дана функция на входе получает 2 параметра имя и возраст.
srting children(string ima, int age)
Нужно написать обертку, для тестирования входящих параметров.
Правильно ли понимаю, что нужно написать функцию допустим test на входе получаем 2 параметра имя и возраст, в данной функции выполняется проходит проверка, что имя не пустая строка, состоящая из символов, без цифр и спец. символов, возраст не отрицательное число.
bool test(string ima, int age)
На выходе true/false подходит ли данный набор для функции children. Меня смущает слово ОБЕРТКА, не совсем понимаю значение этого слова, если я не прав - поправьте меня
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.09.2015, 00:28
Ответы с готовыми решениями:

Что такое Функции в C++
Можете объяснить что такое функции в C++, только подробно. Я не понимаю как они работают и да объясните что такое функции прототипы!...

Что такое файловый буфер? Что такое режим (модификатор) доступа, при работе с файлами?
Что такое файловый буфер? Что такое режим (модификатор) доступа, при работе с файлами?

Что такое прототип функции?
Зачем нужен прототип функции ведь она и без него прекрасно работает? Если можете объясните как чайнику в подробностях) заранее спасибо...

40
 Аватар для Хулиган
88 / 83 / 21
Регистрация: 08.08.2012
Сообщений: 737
19.09.2015, 01:43
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Perfilov Посмотреть сообщение
указанное сокрытие саттер вроде и расписывает дальше или перед этой рекомендацией. зачем тут этот вопрос задавать.
Затем, что он не расписывает реальную ситуацию где это применимо(Используйте данный подход, когда необходимо скрыть детали реализации! и это все), объяснения когда может возникнуть необходимость скрытия - там нет!
0
265 / 165 / 56
Регистрация: 25.02.2015
Сообщений: 435
19.09.2015, 01:44
это Герб Саттер - Решение сложных задач на с++.
Там вроде бы он пишет пишет зачем это надо и в качестве заключения - такая вот рекомендация.
Если что-то конкретно непонятно - то велкам. А то можно оттуда скопипастить текст сюда и так же будет непонятно, а лучше него это расписать - это нужно еще суметь.

Если у вас та же книга, что и у меня - смотрим на страницу 223 на параграф который начинается с
Основные преимущества идимомы скрытой реализации ....

Что конкретно из перечисленных пунктов вам не понятно?
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
19.09.2015, 01:47
Цитата Сообщение от Хулиган Посмотреть сообщение
Затем, что он не расписывает реальную ситуацию где это применимо
в принципе, если написать класс

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
//в заголовке test.h
class Test
{
public:
   //...
   void set_age ( int x )
   {
      if ( age > 0 )
          age_ = age ;
   }
private:
   int age_ ;
} ;
переменная age_ является невидимой для других? Нет, все внутренности класса снаружи и видны клиентам.

Например, написав так
C++
1
2
3
4
5
6
7
#define private public
#include "h.h"
#undef private
 
//...
Test test ;
test.age_ = 10 ;//Достучался в обход сеттера.
очевидно, что никакой инкапсуляции нет в данном случае.

Вот указатель на внутреннюю структуру частично решает проблему, виден только указатель на какую-то структуру и всё.
Это уже больше похоже на инкапсуляцию, конечно, указатель всё-таки виден, но хоть кишки скрыты.
1
 Аватар для Хулиган
88 / 83 / 21
Регистрация: 08.08.2012
Сообщений: 737
19.09.2015, 01:56
Цитата Сообщение от Perfilov Посмотреть сообщение
Что конкретно из перечисленных пунктов вам не понятно?
стр 189, но не в этом суть.
Цель данного подхода - внесение изменений без перекомпиляции проекта.
Следовательно раз это так удобно, то все должны реализовывать свои классы именно так. Но почему листая исходники какого нибудь проекта, такое не встречается?
Значит есть случаи когда это применимо, а когда нет!?
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
19.09.2015, 01:59
Цитата Сообщение от Хулиган Посмотреть сообщение
Но почему листая исходники какого нибудь проекта, такое не встречается?
1) Морока.
2) Шаблоны.
3) Расходы на обращение через указатель.
4) Не решает всей проблемы.
0
265 / 165 / 56
Регистрация: 25.02.2015
Сообщений: 435
19.09.2015, 02:08
такой подход чуть менее эффективен и требует чуть большей писанины, в общем есть оверхед определенный. не везде описываемые преимущества актуальны.
Из своего опыта использования: бывает класс с парой тройкой публичных функций, однако для их реализации дохера других приватных писать надо и всяких разных членов разных типов. так вот чтобы не засирать приватными деталями маленький инклудник и чтобы не переключатся между файлами - да, юзаю такую штуку. По типу как в Java или в C# - мне удобно пилить класс и прям в нем реализовывать функции. С сокращением времени пересборки или там с обеспечением какой-то бинарной совместимости дел не имел.
1
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
19.09.2015, 02:09
Цитата Сообщение от Хулиган Посмотреть сообщение
Но почему листая исходники какого нибудь проекта, такое не встречается?
Однако в исходниках, например, Qt такое встречается повсеместно.
Искал для тебя ссылку в подтверждение и случайно нашел вот такую статью. Думаю будет полезно. Там еще первая часть есть.

Еще такое традиционно встречается в хороших С библиотеках. Функция, например, инициализации возвращает дескриптор-указатель, который объявлен как указатель на неполный тип. Например так:
C++
1
2
struct MyLibImpl;
typedef struct MyLibImpl * MyLibDescr;
А функции библиотеки принимают этот дескриптор первым параметром. Как именно устроен этот MyLibImpl пользователь не знает - он скрыт.

Цитата Сообщение от Хулиган Посмотреть сообщение
Значит есть случаи когда это применимо, а когда нет!?
Да, бывает, что это не нужно. Например из-за затрат на лишнюю косвенность и невозможность inline.
Каждый раз надо думать головой, выбирая то или иное решение, исходя из насущных потребностей и задач проекта.
2
19.09.2015, 02:21

Не по теме:

Действительно интересные и сложные темы содержат пару ответов и всё, а вот такие по сути простые и бесполезные растягиваются аж на несколько страниц. И так практически всегда :(

P.S. или у меня связь хреновая или форум ddos'ят...

0
265 / 165 / 56
Регистрация: 25.02.2015
Сообщений: 435
19.09.2015, 02:28
до кучи по теме Pimpl вспомнилось описание паттерна Bridge в Паттернах проектирования от GoF (http://www.ozon.ru/context/detail/id/2457392/). Посмотрите что они пишут, увидите теперь уже знакомые вещи + дополнительные кейсы применения
такого подхода.
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
19.09.2015, 04:23
Цитата Сообщение от Croessmah Посмотреть сообщение
на выходе - результат children(ima,age)
Цитата Сообщение от Croessmah Посмотреть сообщение
//если же параметры не правильные, то делаем что-то другое, например возвращаем пустую строку return "" ;
Что-то вы сами себе противоречите. Пустая строка - это не то, что ожидает получить вызывающий функцию children. Получается, что функция, усиленная проверкой, выдает невалидные данные.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
19.09.2015, 04:25
Цитата Сообщение от Mr.X Посмотреть сообщение
Пустая строка - это не то, что ожидает получить вызывающий функцию children.
Откуда Вы знаете кто и что должен получать? Контекста нет, в данном случае предположение такое, что пустая строка == ошибка.
И это будет отражено в документации.

Добавлено через 30 секунд
Цитата Сообщение от Mr.X Посмотреть сообщение
Получается, что функция, усиленная проверкой, выдает невалидные данные.
невалидные данные передает, получает пустую строку.
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
19.09.2015, 04:31
Цитата Сообщение от Perfilov Посмотреть сообщение
по хорошему проверкой параметров должна заниматься сама функция children а не какая-то обертка.
Вообще-то специалисты советуют каждой функции поручать только одну задачу. Ведь эти данные берутся откуда-то, почему бы их на входе не проверять на корректность? А если эти данные миллион функций обрабатывает, то в каждой их корректность проверять?

Добавлено через 4 минуты
Цитата Сообщение от Croessmah Посмотреть сообщение
Откуда Вы знаете кто и что должен получать?
Ну дак вы же сами предлагаете в качестве признака ошибки возвращать невалидное значение.
Цитата Сообщение от Croessmah Посмотреть сообщение
невалидные данные передает, получает пустую строку
Вообще не понял эту строку.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
19.09.2015, 04:36
Цитата Сообщение от Mr.X Посмотреть сообщение
Ну дак вы же сами предлагаете в качестве признака ошибки возвращать невалидное значение.
Я предлагаю возвращать пустую строку как признак ошибки. Какие еще варианты? Разве что еще один параметр в функцию передавать для записи туда информации о ошибке, только вот опять же, что возвращать в случае ошибки?
Цитата Сообщение от Mr.X Посмотреть сообщение
Вообще не понял эту строку.
Что тут непонятного? Вызывающая сторона передала какие-то данные, если им "не рада" функция, то получаем в результате пустую строку, то есть если передаваемые данные в порядке, то и возвращаемая строка не пустая, если данные кривые, то и результат пустой (строка пустая).
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
19.09.2015, 04:48
Цитата Сообщение от Croessmah Посмотреть сообщение
Какие еще варианты?
Ну, Страуструп предлагает нам исключения. А почему они вам так не нравятся в библиотечных функциях? Вот стандартная библиотека их вовсю использует и ничего.
Цитата Сообщение от Croessmah Посмотреть сообщение
Вызывающая сторона передала какие-то данные, если им "не рада" функция, то получаем в результате пустую строку, то есть если передаваемые данные в порядке, то и возвращаемая строка не пустая, если данные кривые, то и результат пустой (строка пустая).
Не, я с такой конструкцией не согласен. Сишня сплошная. Исключения лучше.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
19.09.2015, 04:55
Цитата Сообщение от Mr.X Посмотреть сообщение
Ну, Страуструп предлагает нам исключения. А почему они вам так не нравятся в библиотечных функциях?
потому что это дурно пахнет. Попробуйте покидать исключения между библиотеками собранными разными компиляторами, у которых исключения реализуются по разному.
Цитата Сообщение от Mr.X Посмотреть сообщение
Вот стандартная библиотека их вовсю использует и ничего.
Стандартная библиотека также гвоздями прибита к компилятору (собственно как и большинство сущностей, в данном случае и возврат std::string чреват несовместимым ABI) и вся забота о совместимости сугубо на том, кто использует эту библиотеку.
Цитата Сообщение от Mr.X Посмотреть сообщение
Не, я с такой конструкцией не согласен. Сишня сплошная. Исключения лучше.
Если гарантируется совместимость ABI, то можно и исключениями, но если гарантии нет, то бабахнет когда-нибудь
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
19.09.2015, 05:10
Цитата Сообщение от Croessmah Посмотреть сообщение
Попробуйте покидать исключения между библиотеками собранными разными компиляторами, у которых исключения реализуются по разному.
Ну, если исключения по каким-то причинам невозможны, то мне кажется более логичным возвращать из проверяющей функции логическое значение успех-неуспех, а данные возвращать через ссылочные параметры. А иначе у нас просто будет тиражирование и распространение невалидных данных строго проверяющими их функциями.
К тому же, если у нас таких функций миллион, то мы про каждую должны будем помнить что она выдает в случае ошибки.
О, что-то и у меня какие-то зависания форума начались.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
19.09.2015, 05:23
Mr.X, думаю, что всё это должно решаться в определенном контексте, иначе вакуумный конь в сфере получается
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
19.09.2015, 05:31
Цитата Сообщение от Croessmah Посмотреть сообщение
Mr.X, думаю, что всё это должно решаться в определенном контексте, иначе вакуумный конь в сфере получается
Да-да, и мой ответ на ваше сообщение тоже зависит от контекста. Но где тот контекст, который раскроет нам все контексты?
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
19.09.2015, 06:13
Цитата Сообщение от Mr.X Посмотреть сообщение
Но где тот контекст, который раскроет нам все контексты?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
 
 
#define CONTEXT_(arg) #arg 
#define CONTEXT(arg) CONTEXT_(arg)
 
 
#define STR str
 
 
int main()
{
    std::cout << CONTEXT(STR);
}
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
19.09.2015, 11:20
Цитата Сообщение от Хулиган Посмотреть сообщение
в каких случаях применяется такое скрытие реализации?
например, библиотека qt использует идиому pImpl
для сокрытия платформо-специфичных зависимостей.
что делает клиентский код кросс-платформенным.

Добавлено через 1 минуту
Цитата Сообщение от Perfilov Посмотреть сообщение
т.е. вы предлагаете писать функции, которые ведут к UB в случае, если им передали параметры, на которые они не рассчитывают
не понятно с чего были сделаны такие выводы.

Добавлено через 3 минуты
Цитата Сообщение от Mr.X Посмотреть сообщение
А если эти данные миллион функций обрабатывает, то в каждой их корректность проверять?
конечно.

Добавлено через 1 минуту
Цитата Сообщение от Mr.X Посмотреть сообщение
Ну, если исключения по каким-то причинам невозможны, то мне кажется более логичным возвращать из проверяющей функции логическое значение успех-неуспех, а данные возвращать через ссылочные параметры.
лично я так и делаю в таких ситуациях.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.09.2015, 11:20

Что такое ссылки на функции?
Хай. Вопрос в заголовке. Можно, пожалуйста с примером. Спасибо.

Что такое виртуальные функции?
Всем привет! Ребята, что такое виртуальная функция? Как пользоваться ими и для чего они нужны? Может кто объяснить?

Что такое имя функции?
скажите пожалуйста что такое имя функции? создаю указатель на функцию #include &lt;iostream&gt; void foo(void){

Что такое рекурсивный тип данных? Что такое конструкция рекурсивного типа?
Что такое рекурсивный тип данных? Что такое конструкция рекурсивного типа?

Что означает такое обьявление функции?
SimpleCat &amp;TheFunction()


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения: - добавлена многоязычность - добавлено снятие скриншотов - добавлено поддержание бафов хождения по воде (для жреца, дк и шамана) - и так, по. . .
Алиса нашла кучу ошибок компиляции и запуска в проекте, который без проблем компилировался и запускался)))
anaschu 30.06.2026
Я пока посмеюся, но завтра проверю. А вообще интерсно. Дал алисе файл, в котором точно нет ошибок компиляции и запуска, и попросил их найти. Нашла кучу))) Критические ошибки, мешающие компиляции и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru