ilyazh
@ilyazh
Инженер-программист

Как конкретного наследника связать с конкретным родителем?

Здравствуйте. Подскажите пожалуйста.
Существует 2 класса. ComPort и производный от него класс Device.
Существует 2 объекта типа ComPort: COM1, COM2, которые содержат собственные настройки (некие параметры), и, 2 объекта типа Device: Dev1 и Dev2.
Объекты Dev1 и Dev2 используют наследуемую функцию write для записи данных в тот или иной ком-порт.

Как сделать так, чтоб Dev1 использовал параметры только объекта COM1, а Dev2 только параметры COM2? Т.е. как указать жёсткую связь - конкретный родитель - конкретный наследник? Ибо если я пытаюсь в наследнике использовать параметры родителя, то получаю их значения по умолчанию, которые задаются через конструктор класса, а мне нужно использовать заданные для родителей значения бод-рейта, номер физического порта и прочее. Спасибо.
  • Вопрос задан
  • 337 просмотров
Решения вопроса 1
petermzg
@petermzg
Самый лучший программист
Так вы разделите классы ComPort и Device.
И при создание обьекта Device передавайте в него обьект ComPort.
Наследование в вашей задаче не нужно.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@balamyt92
; select * from users; --
Ну как то так(сферический код в вакууме):

COM1.write(Dev1.value)

или

Dev1.write(COM1, value)

это если в общем случает. Без заголовков классов ничего конкретного сказать не могу.
Вообще есть предположение о том что вы не отличаете экземпляр объекта от его описания.
Ответ написан
@res2001
Developer, ex-admin
А если с наследованием, то СОМ1 и СОМ2 тут явно лишние - все действия надо делать через Devы.
Ответ написан
tsarevfs
@tsarevfs Куратор тега C++
C++ developer
Отношение наследования в реальном мире лучше всего описывается словом "является". Каждый ComPort является девайсом, а обратное не верно (вероятно девайсы бывают разные, иначе не понятно зачем такой класс вовсе). Значит Device должен быть базовым классом.
Далее, что касается связи двух экземпляров. Каждый экземпляр класса ComPort и так является Device благодаря наследованию. Функция write у девайса может быть виртуальной и абстрактной (=0 не имеющей своей реализации). В ComPort она будет оверрайдиться уже с конкретной реализацией для порта.
Таким образом вы можете иметь:
Device * d = new ComPort(setting1, setting2);
d.write(data);

в этом случае write будет вызван с нужными настройками (setting1, setting2).

Более того, такой подход позволит использовать разные девайсы единообразно:
std::vector<Device *> ds;
ds.push_back(new ComPort(setting1, setting2));
ds.push_back(new UsbPort(setting3, setting4));

for (auto d : ds)
   d->write(data);
</code
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы