Инициализация экземпляра класса в другом классе
- Войдите на сайт для отправки комментариев
Втр, 29/01/2019 - 08:33
Собсна не получается создать класс на основе двух других. Каким боком вызывать конструкторы этих родительских классов в дочернем? Перебрал несколько пришедших в голову вариантов, ответ компилятора один: no matching function for call to 'InputDev::InputDev()'.
typedef unsigned long dword; class InputDev { public: InputDev(int pin) { _pin = pin; pinMode(_pin, INPUT_PULLUP); _oldSt = active(); } bool active(void) { return (digitalRead(_pin) == LOW); } bool rise(void) { _state = active(); _ret = _state && !_oldSt; delay(5); _ret &= active(); if (_ret) _oldSt = _state; return _ret; } bool fall(void) { _state = active(); _ret = _oldSt && !_state; delay(5); _ret &= !active(); if (_ret) _oldSt = _state; return _ret; } private: bool _oldSt, _state, _ret; int _pin; }; class OutputDev { public: OutputDev(int pin) { _pin = pin; pinMode(_pin, OUTPUT); digitalWrite(_pin, LOW); } void set(bool val) { digitalWrite(_pin, val ? HIGH:LOW); } private: int _pin; }; class BiDirect { public: BiDirect(int inPin, int outPin) { _inPin = inPin; _outPin = outPin; _inObj(inPin); _outObj(_outPin); } bool set(bool val) { _outObj.set(val); return (_inObj.active() == val); } bool active(void) { return _inObj.active(); } bool rise(void) { return _inObj.rise(); } bool fall(void) { return _inObj.fall(); } private: int _inPin; int _outPin; InputDev _inObj; OutputDev _outObj; };
class
BiDirect {
49
public
:
50
BiDirect(
int
inPin,
int
outPin) {
51
_inPin = inPin;
52
_outPin = outPin;
53
_inObj = new InputDev(inPin);
54
_outObj = new OutputDev(_outPin);
55
}
56
bool
set
(
bool
val) {
57
_outObj.
set
(val);
58
return
(_inObj.active() == val);
59
}
60
bool
active(
void
) {
61
return
_inObj.active();
62
}
63
bool
rise(
void
) {
64
return
_inObj.rise();
65
}
66
bool
fall(
void
) {
67
return
_inObj.fall();
68
}
69
private
:
70
int
_inPin;
71
int
_outPin;
72
InputDev *_inObj;
73
OutputDev *_outObj;
74
};
иначе - никаг
request for member 'set' in '((BiDirect*)this)->BiDirect::_outObj', which is of pointer type 'OutputDev*' (maybe you meant to use '->' ?)
в строке 57
ну так это ж теперь указатели, и обращайся с ними как с указателями, через ->
каоче, либо так
_outObj->
set
(val);
либо так
(*
_outObj).
set
(val);
и не забудь тогда деструктор в обьемлющем классе прописать. И лучше всего - виртуальный, на всякий случай.
Большое спасибо добрый человек. Теперь ведь переменные с пинами
больше не нужны я так понимаю. Просто иницируем объкеты прямо в дочернем конструкторе и всё?
естесственно. Пусь оне сами свои пины хранят.
А зачем мне деструктор? У меня обьекты классов что дочернего что родительских "вечные" ))
А зачем мне деструктор? У меня обьекты классов что дочернего что родительских "вечные" ))
Ну.... иногда, случаеца, что это не так. С++ лжив и непредсказуем :)
Можно подробней?
подробней, только в книшках.
Просто поверь и сделай деструктор. если он никогда не понадобица, канпилятор его выкинет.
Ещё хочу создать объект для датчика удара. Что я здесь делаю не так?
sketch/hw.h:92: undefined reference to `Shock::_st'
Каким боком вызывать конструкторы этих родительских классов в дочернем?
Кто Вам сказал, что он у Вас дочерний? Это два независимых класса. Никакого отношения к дочернему не имеют.
Ну, как работать с указателями Вам уже показали. Если же хотите сделать так, как было у Вас (без указателей), то тут есть два варианта (вернее, вариантов больше, но простых два).
1. Инициализируйте члены перед выполнением конструктора. Для этого, в скетче из стартового сообщения, вместо строк №№ 50-55 пишите
и всё будет.
2. Заведите у InputDev/OuputDev коснтуктор по умолчанию, а нынешнюю инициализацию перенесите в init. Т.е. заводите конструктор InputDev(){}. Также заводите метод void Init(int inPin) {_pin = _inPin; } и используете этот Init для инициализации.
Первое проще, по-моему.
Такое будет работать?
Такое будет работать?
Что или кто мешает самому запустить и посмотреть?
Конечно, не будет.
Мешает отсутствие ардуинки под рукой. Наследую два класса с перекрытием одного метода <set> и конструктора. Что не правильно?
Зачем ардуинка? Скомпилировать и посмотреть на ошибки компиляции можно и без неё.
Например, что означают слова Input, Output в строке № 43? Таких классов в программе нет, а что эти слова тогда там делают?
Упс.. извиняюсь, не всё переобозвал, пытался сохранить прежние имена для ясности. Компилируется без ошибок. Вобщем вот:
Ну, явный ляп Вы исправили, а будет ди корректно работать, запустите - посмотрите. Откуда мне знать, если я даже не знаю, что она должна по задумке делать. Запустите, посмотрите, будут вопросы - спросите.
Хотел бы узнать, наследование правильно сделал, класс BiDirect описан корректно? Бедет ли наследовать все методы родителей? Корректно ли создаст их экземпляры при "созданни себя"? Корректно ли заменил метод <set>?
Делаю такое впервые, поэтому успешная компиляцтя ессено ничего не гарантирует. В интернетах есть только примеры наследования одного класса, но про "два в одном" ничего не нашёл. Интересно мнение опытных.
У Вас терминология непонятная. То у Вас посторонние классы - дочерние, то при наследовани создаются экземпляры.
Как создавать экземпляры я Вам написал в посте #13 - надеюсь, Вы его читали.
А здесь создаётся оди экземпляр класса, у которого два родителя. Конструкторы родителей на превый взгляд вызываются нормально.
Терминология как и понимание синтаксиса хромает к сожалению ))) Задача такая:
К пинам подключены "устройства", часть - "контролируемые", которые только читаем, чать "управляемые" в которые только пишем , часть "IO" в которые по одному пину пишем из другого читаем. При этом нужно иметь возможность отслеживать фронты, спады на входах, фильтровать "дребезг" переходных состояний, "писать в выход" импульсы произвольной длинны. Поскольку логика работы со всеми этими устройствами довольно однотипнае, решил глянуть в сторону классов (куда никогда до этого не глядел), иначе основной код превращается в сущий хаос и неразбериху. Вот такакя вот задача. Надеюсь понятно выразился )
vlad072. Вы должны отличать наследование и просто втавки в класс. Вот в классе к примеру переменая int. И скорее нет необходимости ее наследовать с какого-то мифического класса переменных.