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

Calling the same function in many different classes

本文关键字:函数 调用 许多不      更新时间:2023-10-16

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

我已经创建了许多具有(部分)相同成员函数的类。当然,这些功能有不同的实现方式。我希望将这些对象放在一个数组中,之后我可以对它进行迭代,调用这些函数。

我有很多传感器,我们称它们为传感器1、传感器2和传感器3。所有这些都有一个名为readSensor()的函数和一个称为sensorData()的功能。(第一个读取传感器,第二个返回一行html——在我的实际软件中,大约有10-12个传感器和4个这样的功能,因此我希望简化代码,让添加传感器变得更容易)。

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

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();
}
}

通过这种方式,我可以读取所有的传感器,而不必写出所有传感器,并希望以后不会忘记任何传感器。使代码变得更短,我可以在一个地方添加传感器。该阵列仅用于所有传感器具有的功能(名称相同,但实现方式不同——毕竟是不同的传感器)。这些对象还有一些特定于传感器的功能,需要时可以直接调用。

这可能吗?如果是,如何?

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

示例:

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 );
}   
}

您必须根据需要删除示例函数的内容。std::cout在这里只用于让应用程序在可见输出的情况下运行,作为工作方式的示例。

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

也许您必须使用constexpr构造函数来编写类,以便能够在flash中存储数据。使用虚拟方法必须注意:gcc不能将它们存储在flash中。这是一个非常古老的错误/设计问题,浪费了你的小型设备的大量内存。切换到arm设备的一个原因!看见https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43745.如果您的代码中需要大量多态类,这将使avr-gcc不可用。这个错误不会被修复!

是的,这可以通过使用多态性来实现。

您可以定义基类(即Sensor)和子类(即Sensor1Sensor2Sensor3),其中Sensor声明了一个方法readSensor(),并且所有3个子类都实现了该方法,但它们可以通过不同的方式实现。通过这种方式,您可以创建一个具有Sensor类型元素的数组,并在每个元素上调用此方法,然后该方法将调用子类的已实现方法。

仅供参考:如果您愿意,也可以从子类方法中调用基类方法,以实现常见行为。

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