在许多不同的类中调用相同的函数
Calling the same function in many different classes
为了简化我的代码,我希望使用可以存储多个对象的数组,然后可以调用这些对象中的函数。
我已经创建了许多具有(部分)相同成员函数的类。当然,这些功能有不同的实现方式。我希望将这些对象放在一个数组中,之后我可以对它进行迭代,调用这些函数。
我有很多传感器,我们称它们为传感器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
)和子类(即Sensor1
、Sensor2
和Sensor3
),其中Sensor
声明了一个方法readSensor()
,并且所有3个子类都实现了该方法,但它们可以通过不同的方式实现。通过这种方式,您可以创建一个具有Sensor
类型元素的数组,并在每个元素上调用此方法,然后该方法将调用子类的已实现方法。
仅供参考:如果您愿意,也可以从子类方法中调用基类方法,以实现常见行为。
也许也可以查看这个链接:教程
- 函数调用中参数的顺序重要吗
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 变量没有改变?通过向量的函数调用
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数
- 我知道函数调用中存在歧义.有没有办法调用foo()函数
- 模板函数调用
- 获取从C++中同一类中的构造函数调用的方法返回的值
- 析构函数调用
- 成员函数调用和C++对象模型
- 使用共享指针的函数调用,其对象应为 const
- C++:编译时检查匹配的函数调用对?
- 函数调用C++中的参数太少
- 来自 DLL 的函数调用 [表观调用的括号前面的表达式必须具有(指向-)函数类型]
- 返回指向对象的指针的函数调用是否为 prvalue?
- C++ 如何重载 [] 运算符并进行函数调用
- 代码的效率. 转到和函数调用
- 是同一作用域的函数部分中的函数调用
- 如何封装一个函数,以便它只能由同一类中的一个其他函数调用?
- 类型擦除的std::function与虚拟函数调用的开销