晚上好!
我正在写一个Arduino库。在其中,我想从另一个需要实例化其构造函数的库中实例化一个对象,但是我不想对此类参数进行硬编码。我需要一些有关如何执行此操作的指导。
到目前为止,这是我代码的相关部分:
HSBC_CAN.h:
class HSBC_CAN {
public:
HSBC_CAN(uint8_t, uint8_t);
private:
uint8_t _int_pin;
};
HSBC_CAN.cpp:
#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);
}
要清楚一点,从MCP_CAN类实例化对象的方法是MCP_CAN foo(int bar)
,其中bar
是SPI协议的芯片选择引脚号。我希望我的库实例化MCP_CAN类的对象,但是从新类HSBC_CAN实例化对象时,我需要能够传递芯片选择引脚号。这是我在上面的代码中得到的错误:
error: request for member 'begin' in 'canbus_esc', which is of pointer type 'MCP_CAN*' (maybe you meant to use '->' ?)
我在示例代码中所做的方式可能是完全错误的(使用extern
关键字和new
运算符),但这正是我的主意ATM产生的结果。
感谢您的时间。
答案 0 :(得分:0)
来自编译器的错误消息非常有用,如果您遵循其建议,将.
替换为->
,则可能会解决您的直接问题。由于canbus_esc
是一个指针,因此在访问其成员或函数之前必须先取消引用它。因此,如果它具有一个名为begin
且可以使用零参数调用的函数,则可以编写:
canbus_esc->begin();
该行等效于:
(*canbus_esc).begin();
也请在定义extern
的行上删除单词canbus_esc
,否则将得到未定义的引用错误。
但是,您提供的代码有两个问题:首先,您正在使用new
,它可以动态分配内存。如果可能的话,最好避免在小型设备(如AVR)上动态分配内存,因为在实际运行程序之前,您永远都不知道这些分配是否会失败(您可能会在程序的其他部分使用过多的内存) )。其次,您在文件范围内定义了canbus_esc
,因此只能是其中之一。这意味着您不能真正创建多个HSBC_CAN
对象;第二个将覆盖第一个创建的canbus_esc
。尽管这对您的应用程序可能很好,但这似乎是不必要的限制。
我建议改为这样编写您的代码:
头文件:
#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;
};
源文件:
#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对象拥有多个类。