Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 子类调用基类构造函数,然后使用子类Arduino C+中基类的实例方法+;_C++_Oop_Inheritance_Arduino - Fatal编程技术网

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