C / Arduino: как получить доступ к объекту из подкласса

#c #arduino

#c #arduino

Вопрос:

Я подключил сдвиговый регистр к своему Ardunio и создал для него собственный класс. Из основного файла я создаю объект, подобный этому

 ShiftRegister myRegister;

//myRegister.begin(int arduinoPin, int state);
myRegister.begin(int 8, int LOW);

myRegister.write(1, HIGH);
  

До сих пор это работает нормально. Вызывая метод begin(), я получаю свой объект сдвигового регистра с 8 собственными выводами. Я могу напрямую переключать выходные данные моего сдвигового регистра с помощью метода write() (в данном случае вывод 1 сдвигового регистра).

Теперь у вас есть устройство, подключенное к регистру сдвига. Я создаю его из основного файла через

 Device myDevice;

myDevice.switchOn();
  

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

 myDevice.begin(5);
  

После этого я хотел бы только вызвать функцию myDevice.switchOn(), чтобы включить устройство. Поэтому я не хочу делать это напрямую с помощью myRegister.write(5, HIGH), а скорее из класса устройства.

Как мне заставить class Device сделать это? Пока этот класс ничего не знает о регистре сдвига. По указателям? Каким был бы конкретный способ?

Я совсем новичок в C / Arduino, поэтому простите меня, если это может быть довольно тривиальным вопросом. Кроме того, я пока не слишком разбираюсь в объектно-ориентированном программировании…

Комментарии:

1. Является ли изменение вашего ShiftRegister предполагаемого немедленного распространения на все Device ы, которые подключены к этому ShiftRegister , и, таким образом, влияет на все Device s контакты — или вы должны вручную пройти через все Device s вызовы switchOn() ? Кстати, switchOn это плохое название, так как вы не знаете, включится оно или выключится, поскольку оно хранится в ShiftRegister . Кроме того, должны ли два Device s быть подключены к одному и тому же контакту при использовании одного и того же ShiftRegister или это должно быть обнаружено и отклонено?

2. Вы отказались от этого вопроса? Если ни один из ответов не отвечает на ваш вопрос, задайте дополнительные вопросы к ответам или уточните свой вопрос. Одним из разъяснений может быть ответ на вопрос, который я задал выше почти неделю назад.

Ответ №1:

Я не знаком с компонентами Arduino, но..

Вы можете расширить класс устройства:

 class DeviceWithShiftReference: public Device{

    private: ShiftRegister * myShiftReference;

    public: DeviceWithShiftReference(ShiftRegister* reg) {
        myShiftReference = reg
    }

    public: doSomething() {
        // here you can perform stuff with the shift register inside your device 
    }
};

void main(void){
    ShiftRegister myRegister;
    DeviceWithShiftReference myDevice(amp;myRegister);
    myDevice.doSomething();
}
  

Таким образом, вы сохраняете ссылку на свой регистр внутри своего класса, из doSomething() вы можете использовать myShiftReference и выполнять действия с:

 myShiftRegister->begin( ... )
  

Комментарии:

1. @TedLyngmo что вы имеете в виду, говоря «не работает»? Ошибки компиляции?

2. Да, это недопустимый C . private: <all private members> и public: <all public members> все же будет работать. Обычно вам нужен только один private: и one public: . Кроме того, вашим функциям-членам нужны типы.

3. @TedLyngmo Ах да, извините, это опечатка, моя ошибка. Я отредактирую ответ

4. @TedLyngmo отметьте это как правильное, если это решит вашу проблему;)

5. @TedLyngmo с помощью этого метода вы можете реализовать функцию doSomething (например, switchOn()), в которой вы выполняете действия с регистром сдвига прямо внутри класса DeviceWithShiftReference. Я не знаю, является ли Device реализованным вами классом или это часть платформы arduino, поэтому я предложил наследование. Вы можете переопределить устройство, если сможете, с помощью метода pointer to register и добиться того же результата

Ответ №2:

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

 class Device 
{
  public:
    Device(ShiftRegister *pReg, int iPin)
    {
      reg = pReg;
      pin = iPin;
    }
  private:
    int pin;
    ShiftRegister *reg;
}  
  

Затем вы можете сделать

 ShiftRegister myRegister;
myRegister.initStuff(...);
Device  myDevice(amp;myRegister, 5);
.
.
myDevice.switchOff();  // Uses the saved pin value
myDevice.switchOn();
  

Комментарии:

1. Я предлагаю: Device(ShiftRegister *pReg, int iPin) : reg(pReg), pin(iPin) {} и переключить порядок переменных-членов. Кроме того, предоставление ShiftRegister становится необязательным, если конструктор принимает его в качестве указателя. Я предлагаю вам взять его по ссылке, а затем просто сохранить вместо этого указатель. Device(ShiftRegisteramp; rReg, int iPin) : reg(amp;rReg), pin(iPin) {}