首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在我自己的Arduino库中使用外部库?

如何在我自己的Arduino库中使用外部库?
EN

Stack Overflow用户
提问于 2018-06-27 13:33:33
回答 1查看 210关注 0票数 0

晚上好!

我正在编写一个Arduino库。在它内部,我想从另一个库中实例化一个对象,该库的构造函数需要传递一个参数,但我不想对这样的参数进行硬编码。我需要一些关于如何做到这一点的指导。

以下是到目前为止我的代码的相关部分:

HSBC_CAN.h:

代码语言:javascript
运行
复制
class HSBC_CAN {

    public:
        HSBC_CAN(uint8_t, uint8_t);

    private:
        uint8_t _int_pin;

};

HSBC_CAN.cpp:

代码语言:javascript
运行
复制
#include <HSBC_CAN.h>
#include <mcp_can.h>

extern MCP_CAN *canbus_esc;

HSBC_CAN::HSBC_CAN(uint8_t int_pin, uint8_t cs_pin) {

    _int_pin = int_pin;
    canbus_esc = new MCP_CAN(cs_pin);

}

为了清楚起见,从SPI类实例化对象的方法是MCP_CAN foo(int bar),其中bar是MCP_CAN协议的芯片选择管脚号。我希望我的库实例化一个MCP_CAN类的对象,但在实例化我的新类HSBC_CAN中的一个对象时,我需要能够传递芯片选择管脚号。这是我在上面的代码中得到的错误:

代码语言:javascript
运行
复制
error: request for member 'begin' in 'canbus_esc', which is of pointer type 'MCP_CAN*' (maybe you meant to use '->' ?)

也许我在示例代码中使用的方法是完全错误的(使用extern关键字和new操作符),但这只是我的想法。

谢谢你抽出时间来。

EN

回答 1

Stack Overflow用户

发布于 2018-06-28 00:04:54

来自编译器的错误消息非常有用,如果您遵循它的建议,将.替换为->,那么它可能会解决您当前的问题。因为canbus_esc是一个指针,所以在访问它的成员或函数之前必须取消对它的引用。因此,如果它有一个名为begin的函数,可以在没有参数的情况下调用该函数,您可以这样写:

代码语言:javascript
运行
复制
canbus_esc->begin();

这一行相当于:

代码语言:javascript
运行
复制
(*canbus_esc).begin();

另外,在定义canbus_esc的行上去掉单词extern,否则会得到一个未定义的引用错误。

但是,我对您提供的代码有两个问题:首先,您使用的是new,它执行动态内存分配。在像AVR这样的小型设备上尽量避免动态内存分配是一个好主意,因为在你实际运行程序之前,你永远不会知道这些分配是否会失败(你可能在程序的其他部分使用了太多的内存)。其次,您在文件作用域中定义了canbus_esc,因此它们只能有一个。这意味着您不能真正创建多个HSBC_CAN对象;第二个对象将覆盖第一个对象创建的canbus_esc。尽管这对于您的应用程序来说可能很好,但它似乎是一个不必要的限制。

我建议你把代码写成这样:

头文件:

代码语言:javascript
运行
复制
#include <mcp_can.h>
class HSBC_CAN {
public:
  HSBC_CAN(uint8_t int_pin, uint8_t cs_pin);
  void begin();
private:
  uint8_t _int_pin;
  MCP_CAN can;
};

源文件:

代码语言:javascript
运行
复制
#include <HSBC_CAN.h>

HSBC_CAN::HSBC_CAN(uint8_t int_pin, uint8_t cs_pin)
  : can(cs_pin)  // This line constructs the MCP_CAN object
{
  _int_pin = int_pin;
}

HSBC_CAN::begin()
{
  can.begin(42, 42, 42);  // TODO: fix arguments
}

另一个可能更好的方法是让HSBC_CAN对象获取一个指向MBC_CAN对象的指针,并将该指针作为成员变量存储在HSBC_CAN类中。如果要使用该MBC_CAN对象与CAN总线上的多个设备通信,则该选项很有意义。您可以通过指针使用单个MBC_CAN对象来创建多个类。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51055140

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档