首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在许多不同的类中调用相同的函数

在许多不同的类中调用相同的函数
EN

Stack Overflow用户
提问于 2017-10-24 10:36:34
回答 2查看 3.2K关注 0票数 0

为了简化我的代码,我希望使用数组,在数组中可以存储许多对象,然后可以调用这些对象中的函数。

我创建了一些具有(部分)相同成员函数的类。当然,这些功能有不同的实现。我希望将这些对象放在一个数组中,然后再对其进行迭代,调用这些函数。

我有很多传感器,我们称它们为Sensor1,Sensor2和Sensor3。它们都有一个名为readSensor()的函数和一个名为sensorData()的函数。(第一个读取传感器,第二个返回一行html -在我的实际软件中大约有10-12个传感器和4个这样的函数,因此我希望简化代码并使添加传感器更容易)。

所以我想做的是这样的事情:

代码语言:javascript
复制
Sensor1 sensor1;
Sensor2 sensor2;
Sensor3 sensor3;
byte nSensors = 3;

(type?) *sensorList[nSensors] // list of pointers to the sensors - don't know how to declare this.

void setup() { // yes, this is for Arduino.
  sensorList[0] = &sensor1; // store the pointers to the class objects.
  sensorList[1] = &sensor2;
  sensorList[2] = &sensor3;
}

void readSensors () {
  for (int i=1, i<nSnesors, i++) {
    sensorList[i]->readSensor();
  }
}

这样我就可以读出所有的感应器,而不必把所有的感应器都写出来,希望我不会忘记任何感应器。使代码更短,我可以在一个地方添加传感器。这个数组只用于所有传感器所具有的函数(名称相同,但实现不同--这毕竟是不同的传感器)。对象也有一些特定于传感器的功能,在需要时可以直接调用。

这有可能吗?如果是这样的话,是怎么做的?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-10-24 11:02:49

您只需对作业使用运行时多态性。

示例:

代码语言:javascript
复制
class SensorBase
{   
    public:
    virtual void readSensor() = 0;
    virtual void getData(char*) = 0;
};  

class Sensor1: public SensorBase
{   
    void readSensor() { std::cout << "read for Sensor1 called" << std::endl; }
    void getData(char* ptr) { std::cout << "get for Sensor1 called" << std::endl; }
};  

class Sensor2: public SensorBase
{   
    void readSensor() { std::cout << "read for Sensor2 called" << std::endl; }
    void getData(char* ptr) { std::cout << "get for Sensor2 called" << std::endl; }
};  

// Static allocate objects, new is not a good idea for small embedded devices 
// cause of significant overhead. Global objects are typically a design problem,
// but small embedded systems have different requirements ;)

Sensor1 sensor1;
Sensor2 sensor2;

// lets have array to objects, statically allocated
SensorBase* arr[] = { &sensor1, &sensor2 };


int main()
{   
    char htmlString[256];

    for ( auto ptr: arr )
    {   
        ptr->readSensor();
        ptr->getData( htmlString );
    }   
}

您必须根据需要删除示例函数的内容。这里使用cout只是为了让应用程序以可见的输出作为示例运行。

在代码中使用setup方法。这也许是一个好主意,在更大的系统,但不是在avr!如果像我给出的例子一样使用静态分配,您的代码将更小、更快。如果您给编译器一些提示以将一些数据字段或类存储在闪存中,则可以加快速度。关于这个主题,请考虑#include <avr/pgmspace.h>

也许您必须用constexpr构造函数编写类才能在闪存中存储数据。必须用虚拟的方法来支付注意力: gcc不能在闪存中储存它们。这是一个非常老的错误/设计问题,浪费了你的小设备的大量内存。切换到arm设备的原因之一!见bug.cgi?id=43745。如果代码中需要大量多态类,这将使avr gcc无法使用。这个错误不会被修复的!

票数 1
EN

Stack Overflow用户

发布于 2017-10-24 10:44:48

是的,通过使用多态,这是可能的。

您可以定义一个基类(即Sensor)和子类(即Sensor1Sensor2Sensor3),其中Sensor声明了一个方法readSensor(),所有3个子类都实现了这个方法,但它们可以用不同的方式来实现。这样,您就可以使用Sensor类型的元素创建一个数组,并对每个元素调用这个方法,然后调用子类的实现方法。

FYI:如果您愿意的话,也可以从子类方法中调用基类方法,用于常见的行为。

也可以查看这个链接:教程

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46908301

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档