我试图编写一个库,用户可以在函数内定义在给定事件上应该发生什么,即" ON_CONNECTED() { do this }
"。
到目前为止,这是有效的,但我想编写一个默认命令,如果用户不使用该功能,并且我无法弄清楚。
这是我的代码。
#include <TestLibrary.h>
FUNCTION_TO_BE_CALLED() {
Serial.println("This should be printing");
}
TestLib libTest;
void setup() {
Serial.begin(115200);
}
void loop() {
libTest.test();
delay(1000);
}
#ifndef TestLibrary_h
#define TestLibrart_h
#include <Arduino.h>
#define FUNCTION_TO_BE_CALLED() void FunctionToBeCalled()
FUNCTION_TO_BE_CALLED();
class TestLib {
public:
TestLib();
void test();
};
#endif
#include <Arduino.h>
#include <TestLibrary.h>
TestLib::TestLib() {}
/*void FunctionToBeCalled() {
Serial.println("This is the default print");
}*/
void TestLib::test() {
FunctionToBeCalled();
}
我在哪里以及如何编写默认函数?任何帮助将不胜感激。
答案 0 :(得分:0)
(从评论中移出)
解决此类问题的常用方法是使用虚函数和基类,它为可自定义的部分提供默认实现:您提供基类,用户可以从中驱动并替换virtual
函数与他的自定义函数,并将他的类的实例放在一些基类指针(可能通过你的类的一些setter方法),你的代码将用于调用自定义的东西。
另一种(类似的)可能性是提供一个由用户指定的函数指针,默认情况下设置为默认实现。
最后,依赖于实现的可能性也是利用gcc / ld对弱符号的支持,并将您的函数的默认版本作为弱符号提供,可以由用户提供的无错误替换。这不是可移植的,但具有在编译时确实完全解决的优点,并且可以更简单地用于库的缺乏经验的用户 - 他所要做的就是(可能)用给定的名称编写他的函数。另一方面,这种方法本质上仅限于整个程序中的单个自定义 - 所有TestLib
实例将使用相同的自定义事件处理程序,而另外两个方法则自定义是每个实例。