класса-раба? Допустим, есть класс автомобиль и в качестве члена данных он содержит экземпляр автоматическая коробка передач. Во время работы коробки передач, что то пошло не так, необходимо сообщить вышестоящему классу -держателю информацию, чтобы на панели приборов загорелась лампочка "требуется сервис". Я хочу, находясь внутри кода метода коробки передач вызвать метод самого автомобиля(держателя коробки передач). Самое простое решение, это принудительно передавать указатель на экземпляр автомобиля внутрь метода коробки передач. Тогда я смогу через указатель добраться до методов автомобиля. Но правильно ли это
? Быть может существует специальная команда наподобие "вызвать метод хозяина"->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
};
Вроде, вариантов немного, если не передавать в лоб указатель на целый объект - либо возвращать код ошибки, либо держать внутри объекта коробки указатель на метод автомобиля, который лампочкой управляет.
Я читал, вроде бы существуют какие то делегаты, они как бы являются представителем класса, то есть его аватаром. Не знаю, есть ли они напрямую в С++ или быть может есть библиотеки для этого. То есть делегату можно делегировать полномочия Автомобиля и засунуть этого делагата в коробку передач. Если внутри коробки передач надо вызвать метод автомобиля, то она говорит об этом его представителю-делегату, а он уже вызывает метод автомобиля). Вроде бы в Objectice-C как раз такой подход, там именно делегату класса-держателя отдает команды подчиненный класс. Наверняка так можно и в С++. Но я читал, вроде бы в С++ встроенных делегатов нет, но есть примерный аналог указатель на функцию.
https://habr.com/ru/articles/78299/ Вот такое нашёл
Надо передавать прямые ссылки друг на друга, только так
Ага, интересно, да. В моем случае, мне думается, самый простой вариант это просто передавать this Автомобиля в коробку передач, чтоб изнутри коробки можно было вызвать метод автомобиля. Наверное, это самый простой и надежный вариант, тем более коробка внутри машины всегда одна и та же и жесткая связь уже существует, мне же не надо на ходу менять коробку... Но тем не менее, делегаты тоже интересная штука, были бы они в С++...
Нет никаких делегатов в с++
Не знаешь, можно ли сделать такую функцию, будучи вызванной внутри метода класса, являющегося членом данных класса-держателя, чтоб эта функция вернула указатель на класс держатель? Изнутри Коробки передач вызываем get_holder_pointer() -> имеем указатель на автомобиль. ?
Нет нельзя нет таких функций
Это можно только явно если сделаешь, языковых средств для этого нет
Мне в такой схеме не нравится, что коробка сможет, «что угодно» делать по этому указателю
Мне надо из метода коробки просто дернуть метод автомобиля, который будет сообщать автомобилю, что один из его агрегатов требует обслуживания и загорится лампочка на панели.
Да, я понял. Но, если хранится указатель или ссылка, в теории можно через коробку снять колёса, включить сигналку и т.д.
Просто function или bind в качестве хендера передай
Это уже решается интерфейсами. Кажется Вы оверинжинирингом занимаетесь.
Но она всё равно сможет только в рамках публичного интерфейса
Это да, но тем не менее. В таком простом примере вряд ли это критично, но в общем случае, наверное, стоит хотя бы задуматься
Почему у вас коробка - отдельный класс, а приборка с индикаторами неисправностей - нет, так что коробка должна информировать непосредственно автомобиль? Сделайте отдельные интерфейсы для информирования о неисправностях или вообще 1, в который неисправный компонент будет передавать сам себя. И этот интерфейс реализуйте на приборке и передайте в коробку.
Этот "1 интерфейс" называется CAN шина.
я не стал уточнять, но да.
Я нашел вот такое, на мой взгляд супер. https://www.codeproject.com/Articles/5277036/Asynchronous-Multicast-Delegates-in-Modern-Cpluspl
Делегаты - это вы из JAVA, C# взяли? Если вопросы решаются через указатели, то наверное не имеет смысла плодить фичи.
Какие-то комментарии прям не туда. Если нечто существует в стандартной библиотеке определённых языков, то вовсе не значит, что это там и было изобретено
Во первых вопрос не вам был задан, а во вторых человек узнал про делегат, вот и был задан вопрос, где сталкивался с применением, а точнее в перечисленных ли языках. Вы же решили поучить меня, обороты сбавьте и с критикой полегче.
Обсуждают сегодня