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

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

18.10.2014, 15:20. Показов 3968. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Алиса нашла кучу ошибок компиляции и запуска в проекте, который без проблем компилировался и запускался)))
anaschu 30.06.2026
Я пока посмеюся, но завтра проверю. А вообще интерсно. Дал алисе файл, в котором точно нет ошибок компиляции и запуска, и попросил их найти. Нашла кучу))) Критические ошибки, мешающие компиляции и. . .
сукцессия 16. Общий обзор, в основном что бы другие ии поняли
anaschu 29.06.2026
# Передаточный документ: модель микоризной сукцессии (для нового чата) Этот документ предназначен для того, чтобы новый чат Claude мог продолжить работу без необходимости заново разбираться в. . .
сукцессия 15 неявная схема
anaschu 29.06.2026
Алиса Калибровка параметров симбиотической модели: технический обзор Содержание: Введение Постановка проблемы Технические аспекты реализации Процесс внедрения изменений
сукцессия 14. Обновленная схема модели
anaschu 28.06.2026
ГЛОБАЛЬНАЯ ОПИСАТЕЛЬНАЯ СПЕЦИФИКАЦИЯ ЭКОСИСТЕМНОЙ МОДЕЛИ «SOIL CHEMISTRY & MYCORRHIZA 2. 0» https:/ / ibb. co/ NnkGpfMd Представленная интегрированная схема описывает непрерывную нелинейную. . .
сукцессия 13. Питон модель трехзонного мицелия, пока что в основном арбускулярного
anaschu 28.06.2026
## Разработка агентной модели микоризной сукцессии: от выявления артефактов к созданию комплексной системы ### Аннотация Представлено исследование по разработке агентной модели микоризной. . .
сукцессия 12. краткий список проверок модели перед запуском.
anaschu 27.06.2026
Скрытые отказы в моделях систем динамики (SD-models) экологических систем: два случая из практики Контекст Разбирался прототип модели систем динамики (SD-модели) микоризной сукцессии: пять. . .
Сукцессия 11. Проверка орудий перед войной: разработка через тестирование
anaschu 27.06.2026
Как не дать модели соврать самой себе: проверки для симуляции микоризной сукцессии Введение Когда вы строите математическую модель живой системы — грибов, растений, почвы — главная опасность. . .
10 сукцессия. Питон код войны грибов и растений
anaschu 27.06.2026
import numpy as np class PlantAgent: def __init__(self, name, strategy, initial_biomass): self. name = name self. strategy = strategy # "greedy" (широколиственные) или. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru