晚上好!
我正在编写一个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);
}
为了清楚起见,从SPI类实例化对象的方法是MCP_CAN foo(int bar)
,其中bar
是MCP_CAN协议的芯片选择管脚号。我希望我的库实例化一个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
操作符),但这只是我的想法。
谢谢你抽出时间来。
发布于 2018-06-28 00:04:54
来自编译器的错误消息非常有用,如果您遵循它的建议,将.
替换为->
,那么它可能会解决您当前的问题。因为canbus_esc
是一个指针,所以在访问它的成员或函数之前必须取消对它的引用。因此,如果它有一个名为begin
的函数,可以在没有参数的情况下调用该函数,您可以这样写:
canbus_esc->begin();
这一行相当于:
(*canbus_esc).begin();
另外,在定义canbus_esc
的行上去掉单词extern
,否则会得到一个未定义的引用错误。
但是,我对您提供的代码有两个问题:首先,您使用的是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对象来创建多个类。
https://stackoverflow.com/questions/51055140
复制相似问题