子类调用基类构造函数,然后使用子类Arduino c++中基类的实例方法

Subclass calling Base Class constructor then using instance method of Base Class in Subclass Arduino C++

本文关键字:基类 子类 c++ 实例方法 Arduino 调用 构造函数 然后      更新时间:2023-10-16

我有一个基本类FCBRelay,在该类中,它处理将继电器设置为引脚并保持ononForTime等一般方法。

当我试图在子类内调用onForTime时,它不会编译给出错误:

cannot call member function 'void FCBRelay::onForTime(int)' without object

现在我明白了错误是什么,因为onForTime方法不是静态,但我的子类构造函数也调用基类构造函数。这是我的理解。

这样的想法在我的main函数中更具描述性。与其调用waterPump.onForTime(2);,不如调用waterPump.squirt(2);

My Classes如下


FCBRelay.h

#ifndef FCBRelay_H
#define FCBRelay_H
#include <Arduino.h>
class FCBRelay {
  public:
    FCBRelay(int pinNo);
    int delayTime;
    void tick();
    void onForTime(int timeInSeconds);
  private:
    int _pinNumber;
    int _lastTickMillis;
    void on();
    void off();
};
#endif

FCBRelay.cpp

#include "FCBRelay.h"
FCBRelay::FCBRelay(int pinNo) {
  _pinNumber = pinNo;
  pinMode(_pinNumber, OUTPUT);
}
void FCBRelay::onForTime(int timeInSeconds) {
  delayTime = timeInSeconds * 1000;
  on();
}
void FCBRelay::tick() {
  unsigned long currentMillis = millis();
  if((currentMillis - _lastTickMillis) >= delayTime) {
      _lastTickMillis = currentMillis;
      off();
  }
}
void FCBRelay::on() {
  digitalWrite(_pinNumber, HIGH);
}
void FCBRelay::off() {
  digitalWrite(_pinNumber, LOW);
}

FCBWaterPump.h

#ifndef FCBWaterPump_H
#define FCBWaterPump_H
#include "FCBRelay.h"
class FCBWaterPump : public FCBRelay {
  public:
    FCBWaterPump(int pinNo);
    void squirt(int timeInSeconds);
};
#endif

FCBWaterPump.cpp

#include "FCBWaterPump.h"
FCBWaterPump::FCBWaterPump(int pinNo) : FCBRelay(pinNo) {
}
void squirt(int timeInSeconds) {
  FCBRelay::onForTime(timeInSeconds);
}

您不小心编写了一个独立的函数。这就是为什么没有对象

改变:

void squirt(int timeInSeconds) {
  FCBRelay::onForTime(timeInSeconds);
}

:

void FCBWaterPump::squirt(int timeInSeconds) {
//   ^^^^^^^^^^^^^^
  FCBRelay::onForTime(timeInSeconds);
}