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

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

18.10.2014, 15:20. Показов 3975. Ответов 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,875
18.10.2014, 17:10
Студворк — интернет-сервис помощи студентам
а кто мешает вернуть структуру типа
C++
1
2
3
4
5
sruct
{
 bool res;
 string str;
}
и не мучатся
0
 Аватар для taras atavin
4226 / 1796 / 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,705
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 / 1796 / 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,705
18.10.2014, 17:21  [ТС]
Была бы такая универсальная переменная,типа NULL которую можно присвоить любому объекту было бы круто. Возвращаешь её вместо объекта и всё становится ясно проверка не прошла.
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
18.10.2014, 17:22
Да и то две - максимум, а минимально одна.
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
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,705
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,705
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,705
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
Ответ Создать тему
Новые блоги и статьи
В чем ценность человеческого опыта в глобальном смысле?
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