我对C ++很陌生,可能我有天真的问题。我知道还有其他微笑的问题,但与(在我看来)相关的问题比我的更复杂。 我正在尝试使用C ++为Arduino制作固件,并且我因为重载错误而伤害了自己。
我在cpp文件中定义了这段代码:
string str = "insert into Market(Barcode,Name,Code,TemporaryStock,VatcodeID,Unit,NetValue,DiscountValue,UnderlyingValue,VatValue,TotalValue) select * from OPENROWSET('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;Database=" + textBox1.Text + "', 'SELECT * FROM [datasheet1$H:R]')";
SqlCommand cmd2 = new SqlCommand(str.Replace(',', '.'), con);
cmd2.ExecuteNonQuery();
class1初始化为:
void class1::functionA(void)
{
object2.functionOfClass2(class1::functionB);
}
在汇编中给出了
class class1
{
public:
void functionA(void);
void functionB(void);
private:
}
转化为实践:
在我的代码中我在 class1 的成员函数中使用 Wire 库来存放Arduino库,在示例中 object2 和 class2 分别是 TwoWire 类的 Wire 对象。
我需要在 class1 的成员函数中调用 wire 库。 这个解决方案是之前课程的结果,我在课程中学到了我不能在非成员函数中调用 class1 的成员函数,因为非成员函数的实例化是无法实现的。该类尚未实例化为对象,编译器也不知道如何执行此操作。
但是在成员函数中调用 Wire。对象,我认为这是可能的。但实际上,当将 class1 成员函数指针传递给 Wire 函数时,编程器无法知道传递给 wire 的内容。 ,以下是错误的:
no matching function for call to 'class2::functionOfClass2(<unresolved overloaded function type>)'
onRequest 接受void class1::functionA(void)
{
Wire.onRequest(class1::functionB); //wrong
}
函数。
尝试使用
void (*)(void)
错误变为:
错误:没有匹配函数来调用'TwoWire :: onRequest(void (1类:: *)())” 候选人是:void TwoWire :: onRequest(void(*)())
有办法让这些东西有效吗?如果我说 static 和初始化列表,我是否正确使用正确的关键字?
由于
答案 0 :(得分:1)
&class1::functionB
是一个指向成员的函数,而不是一个指向函数的指针。其类型为void (class1::*)(void)
,而非void (*)(void)
,正如onRequest
方法所预期的那样。这意味着要调用此指针指向成员函数,还需要具有该实例(class1*
)。
如果class1
是单身,解决此问题的最简单方法可能是使functionB
成为静态成员,或者只是非成员函数(不在任何类中)。
如果class1
不能被假定为单例,那么库必须有一种方法来传递一个上下文指针(通常是void*
)沿指向函数的指针,这个上下文是回调的参数功能。您应该将this
作为上下文和指向包装函数的指针传递,如下所示:
void wrapper_for_class1_functionB(void* context)
{
static_cast<class1*>(context)->functionB();
}
void class1::functionA(void)
{
Wire.onRequest(&wrapper_for_class1_functionB, this);
}