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 ответов

31 просмотр

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

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
Какие-то комментарии прям не туда. Если нечто суще...

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

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта