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

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

18.10.2014, 15:20. Показов 3625. Ответов 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
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
18.10.2014, 15:24
Кривое проектирование. Если поля "не нужны", то и объекта быть не должно.
По крайней мере, при беглом просмотре кажется, что флаг вообще не должен быть частью объекта.

Если есть проблема, сформулированная в терминах решаемой задачи, опишите ее. Возможно, будет предложено более простое и логичное решение.
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,698
18.10.2014, 15:38  [ТС]
Цитата Сообщение от 0x10 Посмотреть сообщение
Если поля "не нужны", то и объекта быть не должно.
Если бы всё так было у всех хорошо, то и вопросов-то не возникало бы.

Цитата Сообщение от 0x10 Посмотреть сообщение
По крайней мере, при беглом просмотре кажется, что флаг вообще не должен быть частью объекта
О, Господи. Это же ДЕМОНСТРАЦИОННЫЙ КОД. Если я приведу весь код (как это делает 99% форумчан, причём зря) замучаетесь пыль глотать его читать. ВЫ ещё скажите, что поля не нужны- а чё, они же нигде не используются...

Ну это долгая коляска на самом деле. Мне нужна функция (f_0), которая проверяла бы некоторые данные на корректность и при некотором при некотором тык скыть положении вещей возвращала true, а при другом положении вещей возвращала бы false. Если возвращается true, то вызывается другая функция (f_1), которая работает с этими данными, если false- работа останавливается.

При таком положении вещей данные будут обрабатываться ДВА РАЗА, причём одинаковым способом. Первую обработку сделает функция f_0, которая проверит их на корректность, а вторую- f_1; зачем? Пусть одна и та же функция и проверяет их на корректность и возвращает, чтобы с ними можно было работать. Вот я пытаюсь это реализовать. Если всё круто- возвращается true и я спокойно работаю с данными, если возвращается false, я с данными не работаю. Всё ничё, но при возврате false данные всё равно возвращаются (в данном случае поля), хотя они мне не нужны.

++++++++++++++++++++++++++++++++++++++++ ++=

Подход абсолютно не нов. Все строковые функции СИ возвращают NULL или указатель на строку. То есть если указатель NULL - прекращаешь работу, а если не NULL, работаешь с ним.
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
18.10.2014, 15:53
Читаю и не понимаю логики.
Цитата Сообщение от kravam Посмотреть сообщение
Мне нужна функция (f_0), которая проверяла бы некоторые данные на корректность и при некотором при некотором тык скыть положении вещей возвращала true, а при другом положении вещей возвращала бы false
Ок, что принимает эта функция? Кучу переменных или объект, корректность которого нужно проверить?
Цитата Сообщение от kravam Посмотреть сообщение
Если возвращается true, то вызывается другая функция (f_1), которая работает с этими данными, если false- работа останавливается.
C++
1
2
3
4
MyData data;
if (IsDataValid(data)) {
    ProcessData(data);    
}
Цитата Сообщение от kravam Посмотреть сообщение
При таком положении вещей данные будут обрабатываться ДВА РАЗА
Первый - проверка в IsDataValid, где второй?
Цитата Сообщение от kravam Посмотреть сообщение
а вторую- f_1; зачем?
Действительно - зачем? Если эта функция недоступна пользователю и вызывается исключительно во внутреннем коде после гарантированной проверки, то выполнять ее второй раз не нужно.
Или же оставить одну функцию f_1, которая сразу и проверит данные, и обработает.

Добавлено через 2 минуты
Другой вариант: может быть функция, которая создает объект. Если данные невалидны - она тупо не возвращает ничего. Можно проверку делать в конструкторе и в случае неудачи кидать исключение. Можно написать функцию CreateObject, которая вернет опциональный объект и затем проверять его существование.

Добавлено через 1 минуту
Цитата Сообщение от kravam Посмотреть сообщение
Это же ДЕМОНСТРАЦИОННЫЙ КОД
Я только за демонстрационный код. Но в данном случае он совершенно ненагляден и показывает только странную логику, где объект инициализируется сразу булевым флагом.
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
18.10.2014, 15:57
kravam, вот представь себе кота. У него есть цвет шерсти, вес длина хвоста, количество усов... А потом приходишь ты и говоришь: продайте ка мне кота с хвостом неопределённой длины. Вот такой кот - это и есть твоя часть объекта. Можно получить справку о количестве усов, а можно получить кота, но ни как не кота с одним лишь количеством усов и без остальных свойств.
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,698
18.10.2014, 16:44  [ТС]
Цитата Сообщение от 0x10 Посмотреть сообщение
Ок, что принимает эта функция? Кучу переменных или объект, корректность которого нужно проверить?
она принимает вектор строк. Условия такие: в векторе несколько строк. Каждая строка- это число, указывающее на номер следующей строки. Если такая цепочка из чисел заканчивается числом 0, то проверка прошла корректно.
Пример вектора строк:

2
3
1
0
(IsDataValid(data)) должна всю эту бальду проверить. Щас опустим проверяние на количество строк, на то, что эти строки числа. Допустим, эта проверка прошла на OK

Корректна ли цепочка- вот вопрос. Вот IsDataValid(data) выстроила цепочку 2130 (понятен порядок построения цепочки?) и вернула true, поскольку цепочка заканчивается нулём

А теперь следите за руками. Вторая функция ProcessData(data) по заданию в случае, если такая цепочка существует, вернуть её. То есть должна возвратить строку 2310. То есть она опять выстраивает эту же цепочку. повторяя работу, уже проделанную IsDataValid(data). Вот и всё. Вот я и пытаюсь сделать так, чтобы если IsDataValid(data) вернула true, то я оп-ля и сразу же выстроенную цепочку и взял (те самые ненужные поля в kl), а если проверка показывает false, то и поля чтобы не то, что не заполнялись, а чтобы их вообще не было.

В реалии проверка строк много сложнее . Пример демонстрационный. Призван показать, что бывают случаи, когда обработка данных некоторым образом дублирует проверку данных.

Кроме того, два раза передавать вектор строк параметром как-то не того, согласитесь, если можно передать один раз? Это же не int, а целый вектор строк.

Добавлено через 1 минуту
Цитата Сообщение от 0x10 Посмотреть сообщение
Но в данном случае он совершенно ненагляден и показывает только странную логику, где объект инициализируется сразу булевым флагом.
Ну я не знаю, можно было ещё сеттер какой-никакой ввернуть. Что-то мне подсказывает, что так оно проще для понимания. Без сеттера, сразу напрямую.

Добавлено через 2 минуты
Цитата Сообщение от 0x10 Посмотреть сообщение
Или же оставить одну функцию f_1, которая сразу и проверит данные, и обработает.
Я вам битый час об этом твержу. Но попытайтесь понять, что она возвращает объект в ОБОИХ случаях, и когда он нужен (проверка прошла) и когда не нужен (проверка не прошла). Во втором случае достаточно было бы вернуть просто false. То есть флаг, являющийся частью класса. Но часть класса вернуть не получается.
0
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
18.10.2014, 16:45
Цитата Сообщение от kravam Посмотреть сообщение
Кроме того, два раза передавать вектор строк параметром как-то не того, согласитесь, если можно передать один раз? Это же не int, а целый вектор строк.
Ссылки отменили?
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
18.10.2014, 16:47
Цитата Сообщение от kravam Посмотреть сообщение
и когда не нужен (проверка не прошла)
Когда не нужен - можно не возвращать. Можно кинуть исключение, вернуть nullptr или, если используется optional-тип, вернуть none.
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,698
18.10.2014, 16:48  [ТС]
Цитата Сообщение от alsav22 Посмотреть сообщение
Ссылки отменили?
Ну ссылки как я знаю, это всего лишь указатели без синтаксиса указателя. Нет, мне нужно передавать именно объект как объект, а не ссыль на него.

Добавлено через 56 секунд
Цитата Сообщение от 0x10 Посмотреть сообщение
nullptr
Ну вот это другое дело. Вот вы наверное знаете за него? Я я вот вчера даже тему создал- искал аналог NULL в stl и не мог найти.
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
18.10.2014, 16:52
Цитата Сообщение от kravam Посмотреть сообщение
Вот IsDataValid(data) выстроила цепочку 2130 (понятен порядок построения цепочки?) и вернула true, поскольку цепочка заканчивается нулём
А теперь следите за руками. Вторая функция ProcessData(data) по заданию в случае, если такая цепочка существует, вернуть её. То есть должна возвратить строку 2310. То есть она опять выстраивает эту же цепочку. повторяя работу, уже проделанную IsDataValid(data)
В общем, если я все правильно понял, то алгоритм проверки разрешимости задачи практически эквивалентен алгоритму ее решения. В этом случае достаточно оставить только сам алгоритм построения последовательности и продумать как он будет сообщать, что построить результат не удалось. Некоторые способы я выше написал, еще можно результат складывать в входной параметр, а возвращать флаг. Но это, наверное, не самый лучший вариант. Исключение или optional вполне подходит.
0
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
18.10.2014, 16:54
Цитата Сообщение от kravam Посмотреть сообщение
Нет, мне нужно передавать именно объект как объект, а не ссыль на него.
О чём речь, вообще? По ссылке не объект передаётся? Как раз таки объект (реализация так важна?), а не его копия. Ты же страдаешь, что вектор, большой мол ("Это же не int, а целый вектор строк"), ну так и передавай по ссылке, а не по значению.
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,698
18.10.2014, 16:55  [ТС]
Цитата Сообщение от alsav22 Посмотреть сообщение
О чём речь, вообще? По ссылке не объект передаётся? Как раз таки объект, а не его копия.
Ну я это и имел ввиду, а мне нужно чтобы передавалась копия.
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
18.10.2014, 16:59
Цитата Сообщение от kravam Посмотреть сообщение
Ну я это и имел ввиду, а мне нужно чтобы передавалась копия.
А зачем? Она как-то модифицируется внутри функции и этих изменений не должно быть видно в точке вызова?
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
18.10.2014, 17:01
Я так понимаю, что все это затевалось ради оптимизации. Посмотри на move semantic в С++11, это именно то, что тебе нужно.
0
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
18.10.2014, 17:01
Цитата Сообщение от kravam Посмотреть сообщение
а мне нужно чтобы передавалась копия.
Можно узнать: для чего нужна именно копия?
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
18.10.2014, 17:01
Цитата Сообщение от kravam Посмотреть сообщение
Ну ссылки как я знаю, это всего лишь указатели без синтаксиса указателя. Нет, мне нужно передавать именно объект как объект, а не ссыль на него.
Нет. Ссылка есть синоним другого данного. На указателе реализуется ссылка-параметр.
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
18.10.2014, 17:03
Цитата Сообщение от Kastaneda Посмотреть сообщение
Посмотри на move semantic в С++11, это именно то, что тебе нужно.
Ну тут нужно пояснить в каком месте мув. Есть функция, которая принимает данные и либо возвращает результат, либо не может вернуть ничего. Входные параметры - константная ссылка, возвращаемое значение - по значению, может быть перемещено.

Upd: Тут я сам слегка туплю, сорри.
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,698
18.10.2014, 17:06  [ТС]
Цитата Сообщение от alsav22 Посмотреть сообщение
О чём речь, вообще? По ссылке не объект передаётся? Как раз таки объект (реализация так важна?), а не его копия. Ты же страдаешь, что вектор, большой мол ("Это же не int, а целый вектор строк"), ну так и передавай по ссылке, а не по значению.
я не страдаю.
0
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
18.10.2014, 17:08
Цитата Сообщение от kravam Посмотреть сообщение
я не страдаю.
Я образно. Выражаешь беспокойство:
Цитата Сообщение от kravam Посмотреть сообщение
Кроме того, два раза передавать вектор строк параметром как-то не того, согласитесь, если можно передать один раз? Это же не int, а целый вектор строк.
Используя ссылки, можно ни одного раза не передавать.
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,698
18.10.2014, 17:09  [ТС]
Цитата Сообщение от 0x10 Посмотреть сообщение
А зачем? Она как-то модифицируется внутри функции и этих изменений не должно быть видно в точке вызова?
Честно говоря, я с этим ещё не разобрался. Может, оно, конечно, и лучше чтобы передалось по ссыли, только я не знаю, что меня потом ждёт, закалебусь эти ссыли разгребать. Не работаю я с ними почти.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.10.2014, 17:09
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru