我有一个叫做IAckHandler的课程
class IAckHandler {
public:
virtual ~IAckHandler();
virtual void handleAck(long messageType, bool ackrcvd, uint8_t ackByte) = 0;
private:
};
其他类的目的是继承,因此这基本上是一个“接口”类。
我正在使用消息队列向轮询线程(uart comm)提交请求,并希望将IAckHandler传递到消息队列消息中。 结构就像这样:
struct reqmsg
{
long int mtype;
void (*reqHandler)(MasterRadioComm*, uint8_t*);
IAckHandler* ackHandler;
unsigned char mtext[NUM_INDICES];
};
这是提交到消息队列的功能
void Uartcom::req_doSomething(IAckHandler& ackHandler)
{
struct reqmsg req;
if(ackHandler == NULL) req.ackHandler = this;
else req.ackHandler = ackHandler;
msgsnd(m_msgQueueKey, &req, sizeof(struct reqmsg) - sizeof(long), 0);
}
但是当我传入对IAckHandler的引用时,我得到cannot convert ‘IAckHandler’ to ‘IAckHandler*’ in assignment.
我可以从另一个继承IAckHandler的类中调用req_doSomething(this)吗?
答案 0 :(得分:1)
你似乎缺乏一些基本的指针和参考知识。对于示例中给出的req_doSomething
,&ref
将为您提供指向引用对象的指针,因此它应该是
else req.ackHandler = &ackHandler;
要从指针获取引用,请使用*ptr
对其进行引用,以便调用
req_doSomething(*this);
...或者只是删除引用并完全使用指针工作。
更新:正如其他人所指出的,引用不能为NULL。
答案 1 :(得分:1)
更改函数声明以将参数作为指针而不是引用:
void Uartcom::req_doSomething(IAckHandler * ackHandler)
^^^
答案 2 :(得分:1)
您的req_doSomething函数存在一些问题:
req.ackHandler = &ackHandler;
是您想要的)。然而,做这样的事情可能是个更好的主意:
void Uartcom::req_doSomething(IAckHandler * ackHandler)
{
struct reqmsg req;
if(ackHandler == NULL) req.ackHandler = this;
else req.ackHandler = ackHandler;
msgsnd(m_msgQueueKey, &req, sizeof(struct reqmsg) - sizeof(long), 0);
}
答案 3 :(得分:0)
它准确描述了你应该做的事情。
刚刚将对象的地址传递给指针:
req.ackHandler = &ackHandler;
答案 4 :(得分:0)
仔细看。结构中的成员是“IAckHandler *”,而在setter函数中接收的arg是对IAckHandler的引用。你可能想要做的是:
req.ackHandler = &ackHandler;
的问候,
Yati Sagade
答案 5 :(得分:0)
看起来好像你必须在struct reqmsg中将ackHandler声明为IAckHandler *。在C ++中,引用类型(如IAckHandler&)虽然使用指针实现,但在语法上被视为嵌入对象 - 基本上你需要使用IAckHandler&好像它是IAckHandler,而不是IAckHandler *。
因此,您应该可以像这样修复代码:
void Uartcom::req_doSomething(IAckHandler& ackHandler)
{
struct reqmsg req;
if(ackHandler == NULL) req.ackHandler = this;
else req.ackHandler = &ackHandler;
msgsnd(m_msgQueueKey, &req, sizeof(struct reqmsg) - sizeof(long), 0);
}