C++ 子类调用基类构造函数,然后使用子类Arduino C+中基类的实例方法+;
我有一个基类C++ 子类调用基类构造函数,然后使用子类Arduino C+中基类的实例方法+;,c++,oop,inheritance,arduino,C++,Oop,Inheritance,Arduino,我有一个基类FCBRelay,在该类中,它处理将继电器设置到管脚,并保持常规方法,如on或onForTime 当我试图在子类中调用onForTime时,它将不会编译,给出错误: cannot call member function 'void FCBRelay::onForTime(int)' without object 现在我明白了错误的意思,因为onForTime方法不是静态的,但是我的子类构造函数也调用了基类构造函数。我的理解是这样的 这样做的目的是在我的main函数中更具描述性。而
FCBRelay
,在该类中,它处理将继电器设置到管脚,并保持常规方法,如on
或onForTime
当我试图在子类中调用onForTime
时,它将不会编译,给出错误:
cannot call member function 'void FCBRelay::onForTime(int)' without object
现在我明白了错误的意思,因为onForTime方法不是静态的,但是我的子类构造函数也调用了基类构造函数。我的理解是这样的
这样做的目的是在我的main
函数中更具描述性。而不是调用waterPump.onForTime(2)代码>我可以调用水泵.squirt(2)代码>
我的课程如下
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
#ifndef FCBWaterPump_H
#define FCBWaterPump_H
#include "FCBRelay.h"
class FCBWaterPump : public FCBRelay {
public:
FCBWaterPump(int pinNo);
void squirt(int timeInSeconds);
};
#endif
FCBWaterPump.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
#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 "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);
}
#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);
}
您意外地编写了一个独立函数。这就是为什么没有目标
更改此项:
void squirt(int timeInSeconds) {
FCBRelay::onForTime(timeInSeconds);
}
为此:
void FCBWaterPump::squirt(int timeInSeconds) {
// ^^^^^^^^^^^^^^
FCBRelay::onForTime(timeInSeconds);
}
我刚才也发现了这一点。谢谢你的时间。你应该选择这个答案,@steprescott我刚才也发现了。谢谢你的时间。你应该选择这个答案,@StePrescott