c ++ struct引用类型

时间:2011-09-15 19:33:41

标签: c++ inheritance

我有一个叫做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)吗?

6 个答案:

答案 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函数存在一些问题:

  1. ackHandler是一个不能为NULL的引用。
  2. 您正在尝试为指针分配引用(req.ackHandler = &ackHandler;是您想要的)。
  3. 然而,做这样的事情可能是个更好的主意:

    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);
}
相关问题