Arduino可覆盖的功能

时间:2017-06-10 22:55:36

标签: c++ arduino

我试图编写一个库,用户可以在函数内定义在给定事件上应该发生什么,即" ON_CONNECTED() { do this }"。 到目前为止,这是有效的,但我想编写一个默认命令,如果用户不使用该功能,并且我无法弄清楚。

这是我的代码。

.ino文件

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

.h文件

#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

.cpp文件

#include <Arduino.h>
#include <TestLibrary.h>

TestLib::TestLib() {}

/*void FunctionToBeCalled() {
    Serial.println("This is the default print");
}*/

void TestLib::test() {
    FunctionToBeCalled();
}

我在哪里以及如何编写默认函数?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

(从评论中移出)

解决此类问题的常用方法是使用虚函数和基类,它为可自定义的部分提供默认实现:您提供基类,用户可以从中驱动并替换virtual函数与他的自定义函数,并将他的类的实例放在一些基类指针(可能通过你的类的一些setter方法),你的代码将用于调用自定义的东西。

另一种(类似的)可能性是提供一个由用户指定的函数指针,默认情况下设置为默认实现。

最后,依赖于实现的可能性也是利用gcc / ld对弱符号的支持,并将您的函数的默认版本作为弱符号提供,可以由用户提供的无错误替换。这不是可移植的,但具有在编译时确实完全解决的优点,并且可以更简单地用于库的缺乏经验的用户 - 他所要做的就是(可能)用给定的名称编写他的函数。另一方面,这种方法本质上仅限于整个程序中的单个自定义 - 所有TestLib实例将使用相同的自定义事件处理程序,而另外两个方法则自定义是每个实例。