子类调用 Base Class 构造函数然后在子类 Arduino C++ 中使用 Base Class 的实例方法
Subclass calling Base Class constructor then using instance method of Base Class in Subclass Arduino C++
我有一个 Base Class FCBRelay
并且在那个 class 中它处理将继电器设置到引脚并保持一般方法,例如 on
或onForTime
.
当我尝试在 Subclass 中调用 onForTime
时,它不会编译并给出错误:
cannot call member function 'void FCBRelay::onForTime(int)' without object
现在我明白了错误的意思,因为 onForTime
方法不是 static 但我的 Subclass 构造函数调用了 Base Class 构造函数也是。或者说我的理解。
这个想法是为了在我的 main
函数中更具描述性。我可以调用 waterPump.squirt(2);
而不是调用 waterPump.onForTime(2);
我的Class如下
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);
}
我有一个 Base Class FCBRelay
并且在那个 class 中它处理将继电器设置到引脚并保持一般方法,例如 on
或onForTime
.
当我尝试在 Subclass 中调用 onForTime
时,它不会编译并给出错误:
cannot call member function 'void FCBRelay::onForTime(int)' without object
现在我明白了错误的意思,因为 onForTime
方法不是 static 但我的 Subclass 构造函数调用了 Base Class 构造函数也是。或者说我的理解。
这个想法是为了在我的 main
函数中更具描述性。我可以调用 waterPump.squirt(2);
waterPump.onForTime(2);
我的Class如下
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);
}