Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,706

Как сделать так, чтобы вернулась часть объекта?

18.10.2014, 15:20. Показов 4244. Ответов 69
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Поскольку в C++ возможно всё, вот я и решил, может и такое возможно?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
//Должна возвращаться часть этого объекта, 
class kl
{
 
                               //важно
                               //важно
                               //важно
         //Тут всё просто. Конструиреутся объект с аргумента типа 
         //bool, а когда нужно преобразовать объект к типу bool,  
         //возвращается инициализированный флаг                   
         public:
         kl (bool x):flag(x) {}
         
         //Очень важный оператор переопределения типа!
         operator bool () {return flag;} 
        
         private: 
         //очень важный флаг!
         bool flag;
                               //важно
                               //важно
                               //важно
 
         //тут много разных полей, типа наполнители
         //они типа балласт
         int a, b, c, d, e; //и т. д.
 
};
 
//Есть функция, которая должна возвращать тип kl, приведённый к bool, вот так:
//Тут всё просто, f вернёт true или false в зависимости от принятого значения
kl f (bool x)
{
 //Тут придётся весь код менять
 return kl(x);
}
 
 
 
                               //main
                               //main
                               //main
int main ()
{
 
 //А вот использование функции
 
 //start Это нельзя менять эти строки должны остаться неизменными
 kl kl_0= f (false); 
 bool x= kl_0;
 //end Это нельзя менять эти строки должны остаться неизменными  
 
 //На фига мне это всё надо:
 if (x)
 {
  //Работаем с полями kl_0.a, kl_0.b, kl_0.c, kl_0.d, kl_0.e 
 }
 else;
  //А вот тут поля мне даром не нужны!
  return 0;
}
                               //main
                               //main
                               //main
Вот теперь посмотрите. f() возвращает объект типа kl, но, грубо говоря, только в половине случаев нужны будут все его поля a, b, с и так далее- при возврате true. В реальной программе что именно вернётся- true или false будет зависеть от многих факторов, этот тут я могу руками всё прописать. В общем нужно, чтобы f при возврате kl (которое false), как-то отбрасывало, что ли, эти все ненужные поля. Если возвращается false, они мне даром не нужны. Выход из программы и всё. В реальной программе в класс kl будут входить всякие сложные типы и у всех будут конструкторы и все они будут конструироваться. А для чего? При возвращении false они все не нужны и все вызова их конструкторов только зря отнимут время.
Менять можно весь код и реализацию kl, но интерфейс (2 строчки в main) должны остаться неизменными. Спасибо, кто откликнется.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.10.2014, 15:20
Ответы с готовыми решениями:

Как сделать так, чтобы программа копировала часть текста из консоли?
привет. как сделать так, чтобы программа копировала часть текста из консоли и через некоторое время она могла бы его вставить...

Как сделать так, чтобы эта часть кода искала файлы по расширениям?
string file = @"F:\test"; string FileName; DirectoryInfo DI = new DirectoryInfo(file); foreach (FileInfo FI in DI.GetFiles())...

Как сделать так, чтобы эта часть брала любое число из рандома?
Кое-как сделал программу на файлы. Было условие задачи: "Дан файл вещественных чисел. Определить количество нулевых значений в этом...

69
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,878
18.10.2014, 17:10
Студворк — интернет-сервис помощи студентам
а кто мешает вернуть структуру типа
C++
1
2
3
4
5
sruct
{
 bool res;
 string str;
}
и не мучатся
0
 Аватар для taras atavin
4226 / 1799 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
18.10.2014, 17:10
Их не надо разгребать.
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
18.10.2014, 17:11
Цитата Сообщение от kravam Посмотреть сообщение
только я не знаю, что меня потом ждёт
В общем, правило простое. По умолчанию все входные параметры, за копирования которых не хочется платить, нужно передавать по константным ссылкам. Нет копирования, нет сайд-эффектов.

Добавлено через 1 минуту
Цитата Сообщение от ValeryS Посмотреть сообщение
а кто мешает вернуть структуру типа
Не хочется возвращать структуру с полями в непонятном состоянии. Получается переизобретение своего optional.
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,706
18.10.2014, 17:13  [ТС]
Цитата Сообщение от 0x10 Посмотреть сообщение
В общем, правило простое. По умолчанию все входные параметры, за копирования которых не хочется платить, нужно передавать по константным ссылкам. Нет копирования, нет сайд-эффектов.
Я так-то могу и с указателями поработать аккуратно. Потом вдруг окажется, что оказывается именно копию и нужно передавать. Я не могу предусмотреть.
0
 Аватар для Kastaneda
5232 / 3206 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
18.10.2014, 17:15
Цитата Сообщение от 0x10 Посмотреть сообщение
Ну тут нужно пояснить в каком месте мув.
Ну вообще я предполагал избавиться от лишнего копирования при возврате из ф-ции. Но прочитав таки первый пост подумал, что нужно нечто другое. Вообще вариантов много, но пока не остается не понятна конечная цель. Самый простой вариант - возвращать из f() bool и опираясь не него уже строить объект. Тогда можно обойтись без лишнего построения объекта.
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
18.10.2014, 17:15
Цитата Сообщение от kravam Посмотреть сообщение
Я так-то могу и с указателями поработать аккуратно.
Ссылка не может быть неинициализирована - следовательно, безопаснее. И по синтаксису компактнее.
Цитата Сообщение от kravam Посмотреть сообщение
Потом вдруг окажется, что оказывается именно копию и нужно передавать.
В случае с использованием ссылок изменений потребуется на порядок меньше, чем с указателями.
Цитата Сообщение от kravam Посмотреть сообщение
Я не могу предусмотреть.
По-умолчанию пишем константные ссылки. Переделать недолго. И если это входной параметр, то невелика вероятность, что понадобится.
0
 Аватар для taras atavin
4226 / 1799 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
18.10.2014, 17:16
Цитата Сообщение от kravam Посмотреть сообщение
Потом вдруг окажется, что оказывается именно копию и нужно передавать. Я не могу предусмотреть.
Пока не знаешь назначения функции, за неё вообще нельзя браться. А как только назначение известно, то сразу известно, что и как функция меняет. Если меняет, то надо передать именно ссылку и не константную. Если не меняет, то ссылка лишь для экономии, а для маленьких данных копия опять таки для экономии. Единственное, когда нужна именно копия - это когда алгоритм предполагает изменение параметра, а назначение требует сохранить его значение. Ну так когда это выяснится, быстро отменишь ссылочность в одном заголовке и всё. Ну может ещё в прототипе. Это всего две строки.
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
18.10.2014, 17:17
Цитата Сообщение от kravam Посмотреть сообщение
Я не могу предусмотреть.
Передавай по константной ссылке, остальное компилятор подскажет.
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
18.10.2014, 17:18
Цитата Сообщение от Kastaneda Посмотреть сообщение
Самый простой вариант - возвращать из f() bool и опираясь не него уже строить объект.
Я позволю себе привести отвлеченный пример, для иллюстрации. Упрощенный, но конкретный.
Представь, что задача - решить квадратное уравнение. Автор предлагает написать две функции:
Первая - проверяет, что корни в области действительных чисел есть.
Вторая - решает уравнение.
Нюанс - в обоих случаях нужно выполнять одни и те же вычисления.

Вот я и предлагаю первую функцию убрать, а из второй в случае неуспеха кидать исключение.
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,706
18.10.2014, 17:21  [ТС]
Была бы такая универсальная переменная,типа NULL которую можно присвоить любому объекту было бы круто. Возвращаешь её вместо объекта и всё становится ясно проверка не прошла.
0
 Аватар для taras atavin
4226 / 1799 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
18.10.2014, 17:22
Да и то две - максимум, а минимально одна.
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,706
18.10.2014, 17:22  [ТС]
0x10, не ну всё нормально, только это не автор предлагает написать две функции. Я-то как раз- хочу написать одну функцию.
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
18.10.2014, 17:24
Цитата Сообщение от kravam Посмотреть сообщение
Была бы такая
Я несколько раз упоминал одно и то же решение, но почему-то в игноре. Поэтому задам вопрос прямо: почему не нравится вариант с бросанием исключения?

Добавлено через 1 минуту
Цитата Сообщение от kravam Посмотреть сообщение
только это не автор предлагает написать две функции.
В исходном черновом варианте, с объяснением причин, почему это решение неоптимально, и т д. Это понятно все.
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,706
18.10.2014, 17:24  [ТС]
Цитата Сообщение от 0x10 Посмотреть сообщение
Я несколько раз упоминал одно и то же решение, но почему-то в игноре. Поэтому задам вопрос прямо: почему не нравится вариант с бросанием исключения?
Ну я их почти не использую, мало с ними работал. Может, попроще что есть.
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
18.10.2014, 17:26
Цитата Сообщение от kravam Посмотреть сообщение
Ну я их почти не использую, мало с ними работал.
Это говорит только о том, что нужно разобраться с инструментом и изучить его возможности, а не придумывать несуществующие на основе своего понимания. Вот и получается потом - ищешь в языке фичи, а их нет.
Короче, сейчас набросаю код с вариантами, если в коде понятнее будет. На примере квадратного уравнения.
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,706
18.10.2014, 17:28  [ТС]
Ну так-то да. Да можно не набрасывать, литература есть же.
0
 Аватар для Kastaneda
5232 / 3206 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
18.10.2014, 17:30
Цитата Сообщение от 0x10 Посмотреть сообщение
Вот я и предлагаю
я всю переписку не читал, многабукв.
Предложение избавиться от одной из ф-ций конечно правильное, но имхо - если есть цель оптимизировать код, то исключения не лучший вариант.
А почему бы в конструкторе не сделать проверку - если bool аргумент конструктора false, то не заморачиваться с остальными членами класса?
Объекту добавить состояние валидный/невалидный. По возвращению из ф-ции проверять obj.isValid(). Во все геттеры других членов добавить
C++
1
assert(is_valid_ == true, "Invalid object");
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
18.10.2014, 17:32
Цитата Сообщение от kravam Посмотреть сообщение
Ну так-то да. Да можно не набрасывать, литература есть же.
Ну ок.

Цитата Сообщение от Kastaneda Посмотреть сообщение
А почему бы в конструкторе не сделать проверку - если bool аргумент конструктора false, то не заморачиваться с остальными членами класса?
Вот я потому и говорил, что пример ненагляден. Этот аргумент вычисляется. Вычислить его можно только в процессе работы самого алгоритма.
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,706
18.10.2014, 17:35  [ТС]
Цитата Сообщение от Kastaneda Посмотреть сообщение
А почему бы в конструкторе не сделать проверку - если bool аргумент конструктора false, то не заморачиваться с остальными членами класса?
Это всего лишь демонстрационный код. То есть он показывает, что возвращаемое значение зависит от флага. А флаг можно по разному инициализировать. Видел там данные-поля int? Вот на основе их анализа и строится значение флага. Даже не на основе их, там строки проверяются, то есть вместо int должны быть string и не string даже а vector<string>. Вот вектор строк функция f анализирует и на основе этого анализа кропает объект с нужным флагом.
0
 Аватар для Kastaneda
5232 / 3206 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
18.10.2014, 17:38
Тогда как сразу предлагал - почитать про move. Самое простое решение наверно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.10.2014, 17:38

Как сделать так, чтобы по гипперссылке менялась не вся страница а только ее внутренняя часть!
Помогите пожалуйста! Как сделать так, чтобы по гипперссылке менялась не вся страница а только ее внутренняя часть! ?????? :huh:

Как сделать так, чтобы график занимал не всю форму, а лишь определенную часть
Здравствуйте, Как сделать так, чтобы график занимал не всю форму, а лишь определенную часть, например правый верхний угол. Или это...

Как сделать так чтобы метод объекта возвращал бы объект своего же типа?
Как сделать так чтобы метод объекта возвращал бы объект себя своего же типа?

Как сделать так чтобы картинка в Image не мерцала при увеличении объекта?
Может кто нить подсказать как сделать так чтобы картинка в Image не мерцала при увеличении объекта? Мож буферизировать надо или чё нить...

Как сделать так, чтобы программа на free pascal или ее часть выполнялась на всех ядрах и потоках?
Как сделать так, чтобы программа на free pascal или ее часть выполнялась на всех ядрах и потоках? Чтобы пошустрее работала.


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки. Добавлены следующие реквизиты типа Булево: - Буквы; - Цифры; - Символы. Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей. Самым главным критерием для. . .
Установка ChatGPT (Codex) на Windows без использования Microsoft Store
Fabien159 28.10.2026
Здравствуйте всем читающим! Опишу процесс установки ChatGPT (Codex) на Windows, если по каким-то причинам у вас не получается устанавить его через Microsoft Store. И так: 1. Скачиваем с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru