为了简化我的代码,我希望使用数组,在数组中可以存储许多对象,然后可以调用这些对象中的函数。
我创建了一些具有(部分)相同成员函数的类。当然,这些功能有不同的实现。我希望将这些对象放在一个数组中,然后再对其进行迭代,调用这些函数。
我有很多传感器,我们称它们为Sensor1,Sensor2和Sensor3。它们都有一个名为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();
}
}这样我就可以读出所有的感应器,而不必把所有的感应器都写出来,希望我不会忘记任何感应器。使代码更短,我可以在一个地方添加传感器。这个数组只用于所有传感器所具有的函数(名称相同,但实现不同--这毕竟是不同的传感器)。对象也有一些特定于传感器的功能,在需要时可以直接调用。
这有可能吗?如果是这样的话,是怎么做的?
发布于 2017-10-24 11:02:49
您只需对作业使用运行时多态性。
示例:
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无法使用。这个错误不会被修复的!
发布于 2017-10-24 10:44:48
是的,通过使用多态,这是可能的。
您可以定义一个基类(即Sensor)和子类(即Sensor1、Sensor2和Sensor3),其中Sensor声明了一个方法readSensor(),所有3个子类都实现了这个方法,但它们可以用不同的方式来实现。这样,您就可以使用Sensor类型的元素创建一个数组,并对每个元素调用这个方法,然后调用子类的实现方法。
FYI:如果您愿意的话,也可以从子类方法中调用基类方法,用于常见的行为。
也可以查看这个链接:教程
https://stackoverflow.com/questions/46908301
复制相似问题