【问题标题】:Inheritance problems in arduino c++arduino c++中的继承问题
【发布时间】:2017-05-05 11:50:09
【问题描述】:

我在 Arduino 环境中的类定义中遇到了继承方法的问题。我有一个基类portal,它继承自类gauge,然后meter 继承自gauge。基类有一个方法的定义,但编译器说它找不到meter::method 的定义。 头文件:

#ifndef UIelements_h
#define UIelements_h

#include "Arduino.h"
#include "UTFT.h"
#include "URTouch.h"
#include "UTFT_Geometry.h"
    class portal
{
  public:
    UTFT* myDisplay;
    int origin[2]={0,0};
    int portalSize[2]={10,10};
    int BGColor=VGA_BLACK;
    int borderSize=1;
    int borderColour=VGA_WHITE;

    portal();
    portal(UTFT* myDisplay);
    void draw(void);
    void drawContents(void);

    private:
    bool firstdraw=true;

};

class guage :public portal
{
  public:   
    UTFT_Geometry* myGeometry;
    float scaleMin=0.0;
    float scaleMax=100.0;
    float tick=20;
    bool logScale=false;
    int scaleColour=VGA_WHITE;
    int foreColour=VGA_YELLOW;
    float redBegin=80.0;
    int redColour=VGA_RED;
    float value=0;
    float lastValue=0;

    guage();
    guage(UTFT*,UTFT_Geometry*);
    void setNewValue(float);
};

class meter :public guage
{
  public:
    float startAngle=-40.0;
    float endAngle=40.0;
    float scaleRadius=80.0;

    meter();
    meter(UTFT*,UTFT_Geometry*);
    void setValueAndDraw(float);

  private:
    void PointerDraw(float);

};

.cpp

#include "Arduino.h"
#include "UIelements.h"

portal::portal()
{
}
    portal::portal(UTFT* UTFT)
{
    // constructor: save the passed in method pointers for use in the class
    myDisplay=UTFT;
}

void portal::draw(void)
{
    // draw the contents
    if (firstdraw)
    {
    // draw background and border
    }
    else
    {
    drawContents();
    }
}

void portal::drawContents(void)
{
    //portal class has no contents to draw, but subclasses will have..
}

...

meter::meter(UTFT* UTFT,UTFT_Geometry* Geometry)
{
    // constructor save the passed in method pointers for use in the class
    myDisplay=UTFT;
    myGeometry=Geometry;
}

void meter::setValueAndDraw(float newValue)
{
    setNewValue(newValue);
    draw();
}

void meter::drawContents(void)
{
    float xcentre=origin[1]+portalsize[1]/2;
    float ycentre=origin[2]+portalSize[2]-1;
    if (firstdraw=true)
//...more code in here..
}

错误信息

错误:没有在中声明的“void Meter::drawContents()”成员函数 类“米”

我问了几个人,但似乎每个人都认为类继承看起来不错 - 这是 Arduino 的事情,还是有一些我不明白的基本原理?感激地收到任何帮助。我担心这是一些愚蠢的错字或; 等的遗漏。

【问题讨论】:

  • 声明void drawContents(void)portal 的一部分,而不是meter...
  • 错误信息很清楚,在meter类中没有声明drawContents成员,即使它确实从portal基类继承drawContents成员。

标签: c++ inheritance arduino


【解决方案1】:

在 C++ 中,当您想要覆盖子类中的行为时,您必须将函数标记为虚拟函数并再次在子类中声明它们。

所以你必须这样做:

class portal
{
  public: virtual void drawContents();
};

void portal::drawContents()
{
//do stuff
}

class meter : public portal
{
public:
    virtual void drawContents() override; // virtual may be omitted
};

void meter::drawContents()
{
// override behavior
}

drawContents 之后的关键字 override 是一个相对较新的 C++ 特性。它可能无法由 arduino 编译器实现。那你可以省略它。

【讨论】:

  • 感谢您的解释。我想我希望编译器自己解决它。必须重新定义它似乎相当笨拙,在我的示例中使覆盖变得毫无意义。
  • 再次感谢您这么快救了我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-11
  • 2011-09-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多