быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705

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

18.10.2014, 15:20. Показов 4076. Ответов 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
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
19.10.2014, 02:14
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от kravam Посмотреть сообщение
Да в какой функции-то?
Вот в этих, куда передаётся указатель:
Цитата Сообщение от kravam Посмотреть сообщение
Для каждого потока существует функция потока, в неё передаётся указатель на структуру.
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
19.10.2014, 02:20  [ТС]
Потому что данные, которыми заполняется эта структура известны ТОЛЬКО вне этой функции. Например, каждый поток работает с каким-нибудь файлом. Имя этого файла и надо передать в поток, запаковав его в эту самую структуру. И сделать это, как ты понимаешь, в функции потока нельзя. Ибо имя файла известно ТОЛЬКО за её пределами.

Хе, если бы данные были известны в функции потока, то и структуры никакой не понадобилось бы. Передал NULL и работаешь с ними спокойно, как с локальными.
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
19.10.2014, 06:52
От высоких материй к проблемам насущным.
Цитата Сообщение от kravam Посмотреть сообщение
Не это ли имел ввиду 0X10, говоря
Почти. Возвращать указатель - действительно вариант. Но лично мне этот вариант не нравится по своей семантике, boost::optional - выразительнее.

И уж ни в коем случае не нужно вручную управлять памятью.
Цитата Сообщение от kravam Посмотреть сообщение
То есть в случае удачи возвращать vector<string>*. И тогда не понадобится ничего удалять с помощью delete.
Если память выделена динамически, то она обязана быть освобождена.

Проблема в том, что читая прототип функции, которая возвращает указатель - невозможно понять, нужно ли освобождать память. Нужно читать документацию, ибо в линуксовом апи, например, есть функции, которые возвращают указатель на свою внутреннюю статическую переменную.

Цитата Сообщение от kravam Посмотреть сообщение
Остаётся только внимательно проследить за удалением.
Вот это фраза, которая доказывает, что функция спроектирована плохо. Функцию должно быть легко использовать.

Мораль. Не используйте ручное управление памятью в коде. Есть std::shared_ptr / std::unique_ptr.
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
19.10.2014, 07:25
Цитата Сообщение от 0x10 Посмотреть сообщение
Мораль. Не используйте ручное управление памятью в коде.
То есть пишите только примеры?

Добавлено через 4 минуты
Цитата Сообщение от 0x10 Посмотреть сообщение
Проблема в том, что читая прототип функции, которая возвращает указатель - невозможно понять, нужно ли освобождать память.
Вы в состоянии по одному лишь прототипу понять, что делает функция? Одного только факта, что не надо освобождать память, для использования любой функции не достаточно, нельзя применять даже sqr, пока не уяснишь, что она в таком то языке возвращает не квадрат, а квадратный корень. А если прочитать описание функции, то там сказано и что она выделяет.
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
19.10.2014, 07:53
Цитата Сообщение от taras atavin Посмотреть сообщение
То есть пишите только примеры?
В смысле?

Цитата Сообщение от taras atavin Посмотреть сообщение
Вы в состоянии по одному лишь прототипу понять, что делает функция? Одного только факта, что не надо освобождать память, для использования любой функции не достаточно
Читать доки нужно. Это не значит, что нужно усложнять жизнь.
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
19.10.2014, 08:08
Цитата Сообщение от 0x10 Посмотреть сообщение
Читать доки нужно.
Вот именно.
Цитата Сообщение от 0x10 Посмотреть сообщение
Это не значит, что нужно усложнять жизнь.
А в чём здесь усложнение?
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
19.10.2014, 08:24
taras atavin, функция может быть написана так, чтобы по коду было ясно как ее использовать правильно. Как минимум в плане управления памятью. В случае возврата простого указателя становится документация становится необходима. И она не всегда есть.
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
19.10.2014, 08:28
По коду это понятно всегда, язык надо знать. Но это долго и код может быть закрыт. Вот поэтому то и нужны комментарии.

Добавлено через 2 минуты
Цитата Сообщение от 0x10 Посмотреть сообщение
И она не всегда есть.
Должна быть. Если её нет, то не имеет значения, возвращает ли функция указатель, пользоваться функцией можно только прочитав её исходник, а он не всегда есть. Кроме того, если возвращается указатель, то как можно умудриться не додуматься до его освобождения?
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
19.10.2014, 08:36
Цитата Сообщение от taras atavin Посмотреть сообщение
Должна быть.
Добро пожаловать в реальный мир.
Более-менее документируется api для пользователей библиотеки. К внутренним функциям документация может отсутствовать. И проще работать с тем кодом, к реализации которого не нужно обращаться каждый раз, чтобы понять как обращаться с методами.

Цитата Сообщение от taras atavin Посмотреть сообщение
Кроме того, если возвращается указатель, то как можно умудриться не додуматься до его освобождения?
Пример - функция getpwent. Возвращает указатель на static переменную, освобождать память не нужно. Тут спасает только документация. Но это Си. Мы говорим о С++, где мы можем себе позволить не управлять памятью вручную без крайней на то необходимости.

Далее спор продолжать не хочу, ибо он уходит от темы.
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
19.10.2014, 08:42
Цитата Сообщение от 0x10 Посмотреть сообщение
Добро пожаловать в реальный мир.
Более-менее документируется api для пользователей библиотеки.
То есть Вы взломали на свою голову библиотеку и юзаете напрямую её функции для внутреннего употребления и теперь хнычетесь, что там ничего не документировано? Нефиг жаловаться, крякер должен понимать, чего наломал.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.10.2014, 08:42

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
70
Ответ Создать тему
Опции темы

Новые блоги и статьи
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302 Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru