170 похожих чатов

Каким образом можно вызвать метод класса-хозяина изнутри метода

класса-раба? Допустим, есть класс автомобиль и в качестве члена данных он содержит экземпляр автоматическая коробка передач. Во время работы коробки передач, что то пошло не так, необходимо сообщить вышестоящему классу -держателю информацию, чтобы на панели приборов загорелась лампочка "требуется сервис". Я хочу, находясь внутри кода метода коробки передач вызвать метод самого автомобиля(держателя коробки передач). Самое простое решение, это принудительно передавать указатель на экземпляр автомобиля внутрь метода коробки передач. Тогда я смогу через указатель добраться до методов автомобиля. Но правильно ли это
? Быть может существует специальная команда наподобие "вызвать метод хозяина"->service required() struct Autogearbox {
void select_drive_mode(Enum_drive_mode drive_mode ){
// here gearbox checks its temperature, if overheat it must inform holder in someway
// in this case the holder is car
if ( is_overheat_gearbox() ) { get_holder_method->service_required() }
}
};


struct Car {
void service_required() { // the code to lightON red lamp on driver front panel}
Autogearbox gearbox{}; // here Car holds the gearbox as datamember
};

23 ответов

10 просмотров

Вроде, вариантов немного, если не передавать в лоб указатель на целый объект - либо возвращать код ошибки, либо держать внутри объекта коробки указатель на метод автомобиля, который лампочкой управляет.

The Pressbraker- Автор вопроса
Андрей Таусинов
Вроде, вариантов немного, если не передавать в лоб...

Я читал, вроде бы существуют какие то делегаты, они как бы являются представителем класса, то есть его аватаром. Не знаю, есть ли они напрямую в С++ или быть может есть библиотеки для этого. То есть делегату можно делегировать полномочия Автомобиля и засунуть этого делагата в коробку передач. Если внутри коробки передач надо вызвать метод автомобиля, то она говорит об этом его представителю-делегату, а он уже вызывает метод автомобиля). Вроде бы в Objectice-C как раз такой подход, там именно делегату класса-держателя отдает команды подчиненный класс. Наверняка так можно и в С++. Но я читал, вроде бы в С++ встроенных делегатов нет, но есть примерный аналог указатель на функцию.

Надо передавать прямые ссылки друг на друга, только так

The Pressbraker- Автор вопроса
Андрей Таусинов
https://habr.com/ru/articles/78299/ Вот такое нашё...

Ага, интересно, да. В моем случае, мне думается, самый простой вариант это просто передавать this Автомобиля в коробку передач, чтоб изнутри коробки можно было вызвать метод автомобиля. Наверное, это самый простой и надежный вариант, тем более коробка внутри машины всегда одна и та же и жесткая связь уже существует, мне же не надо на ходу менять коробку... Но тем не менее, делегаты тоже интересная штука, были бы они в С++...

The Pressbraker- Автор вопроса
Ilya Zviagin
Надо передавать прямые ссылки друг на друга, тольк...

Не знаешь, можно ли сделать такую функцию, будучи вызванной внутри метода класса, являющегося членом данных класса-держателя, чтоб эта функция вернула указатель на класс держатель? Изнутри Коробки передач вызываем get_holder_pointer() -> имеем указатель на автомобиль. ?

The Pressbraker
Не знаешь, можно ли сделать такую функцию, будучи ...

Это можно только явно если сделаешь, языковых средств для этого нет

The Pressbraker
Ага, интересно, да. В моем случае, мне думается, с...

Мне в такой схеме не нравится, что коробка сможет, «что угодно» делать по этому указателю

The Pressbraker- Автор вопроса
Андрей Таусинов
Мне в такой схеме не нравится, что коробка сможет,...

Мне надо из метода коробки просто дернуть метод автомобиля, который будет сообщать автомобилю, что один из его агрегатов требует обслуживания и загорится лампочка на панели.

The Pressbraker
Мне надо из метода коробки просто дернуть метод ав...

Да, я понял. Но, если хранится указатель или ссылка, в теории можно через коробку снять колёса, включить сигналку и т.д.

The Pressbraker
Мне надо из метода коробки просто дернуть метод ав...

Просто function или bind в качестве хендера передай

Андрей Таусинов
Да, я понял. Но, если хранится указатель или ссылк...

Это уже решается интерфейсами. Кажется Вы оверинжинирингом занимаетесь.

Андрей Таусинов
Мне в такой схеме не нравится, что коробка сможет,...

Но она всё равно сможет только в рамках публичного интерфейса

Ilya Zviagin
Но она всё равно сможет только в рамках публичного...

Это да, но тем не менее. В таком простом примере вряд ли это критично, но в общем случае, наверное, стоит хотя бы задуматься

The Pressbraker
Мне надо из метода коробки просто дернуть метод ав...

Почему у вас коробка - отдельный класс, а приборка с индикаторами неисправностей - нет, так что коробка должна информировать непосредственно автомобиль? Сделайте отдельные интерфейсы для информирования о неисправностях или вообще 1, в который неисправный компонент будет передавать сам себя. И этот интерфейс реализуйте на приборке и передайте в коробку.

The Pressbraker- Автор вопроса
Андрей Таусинов
https://habr.com/ru/articles/78299/ Вот такое нашё...

Я нашел вот такое, на мой взгляд супер. https://www.codeproject.com/Articles/5277036/Asynchronous-Multicast-Delegates-in-Modern-Cpluspl

The Pressbraker
Ага, интересно, да. В моем случае, мне думается, с...

Делегаты - это вы из JAVA, C# взяли? Если вопросы решаются через указатели, то наверное не имеет смысла плодить фичи.

Rearden
Делегаты - это вы из JAVA, C# взяли? Если вопросы ...

Какие-то комментарии прям не туда. Если нечто существует в стандартной библиотеке определённых языков, то вовсе не значит, что это там и было изобретено

Igor Okhremchuk
Какие-то комментарии прям не туда. Если нечто суще...

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

Похожие вопросы

Обсуждают сегодня

у меня такой вопрос про память в x86 возник, может кто пояснить?.. у процессора есть (как минимум) 3 типа адресов (названия "п1", "п2", "п3" --- мои, чтобы проще было дальше)...
Toideng
5
у процессора есть (как минимум) 3 типа адресов (названия "п1", "п2", "п3" --- мои, чтобы проще было дальше): - "п1" --- виртуальный адрес, то есть тот, который ресолвится в "п...
Toideng
3
а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
Hello, I need a hand, this is my code: body: ExtendedImageGesturePageView.builder( scrollDirection: Axis.vertical, controller: _pageController, itemCou...
𝘞𝘦𝘢𝘳𝘪𝘯𝘨𝘔𝘦𝘥𝘢𝘭 🦋
1
читать файл максимально быстро? странный вопрос))
zamtmn
50
why html and css is not standard? i mean why different browser has their own engine and styles and how them work to show result to end user?
Mr Thieves
11
Господа, как быстро вставлять множество постов через wp_insert_post? использую wp_defer_term_counting wp_defer_comment_counting SET autocommit = 0 pre_wp_unique_post_slug но ...
Александр
4
TCodePointer = record cp: CodePointer; name: string; cnt: Integer; next: TCodePointerArray; // этот тип ещё неизвестен end; TCodePointerArray = array of ...
notme
9
Добрый день. Хочу сделать отрисовку по команде на панели. Почему-то рисуется только при втором вызове. С чем может быть связано, не подскажете? procedure TForm1.FormDblClick(...
Kirill Filippenok
20
Please any new resources to learn flutter?
Gbonafha Ayehnor
8
Карта сайта