2011-09-15 99 views
1

我有一個名爲IAckHandlerC++結構引用類型

class IAckHandler { 
public: 
    virtual ~IAckHandler(); 

    virtual void handleAck(long messageType, bool ackrcvd, uint8_t ackByte) = 0; 
private: 

}; 

的預期用途是用於其他類繼承的類,所以這基本上是一個「接口」級。

我使用消息隊列提交請求的輪詢線程(UART通訊),並希望在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

你不需要說'struct'在C++中。 'reqmsg req;'和'sizeof(reqmsg)'做得很好。 –

+0

猜想我卡在C陸地。 – user623879

回答

1

你似乎缺乏一些基本的指針和引用的知識。對於例子中的req_doSomething&ref會給你一個指針引用的對象,所以應該是

else req.ackHandler = &ackHandler; 

,並從一個指針得到一個參考,你*ptr derreference它使通話將

req_doSomething(*this); 

...或者剛落參考,並完全與指針的工作。

更新:正如其他人所指出的那樣,參考不能爲空。

+0

ah ok ..所以「this」是一個指針,而不是引用類型。當我使用「這個」時,我需要做這個 - >或這個。 – user623879

+0

@ user623879:你需要使用'這 - >' – GWW

+0

因爲我們在這裏討論的引用類型,則是比較特殊的文本'0'和類型的對象'IAckHandler&'之間。假設它是另一種錯誤,如果'(ackHandler == NULL)'的初衷,但必須注意的是,'&ackHandler'確實可以比較等於'0'!以示例函數'void test(int&a){cout <<&a << endl; }'並且像這樣調用它:'test(*(int *)0)'。 –

1

改變你的函數聲明採取的參數作爲一個指針,而不是一個參考:

void Uartcom::req_doSomething(IAckHandler * ackHandler) 
             ^^^ 
0

它描述了你應該做什麼。

剛剛過去的對象的地址指針:

req.ackHandler = &ackHandler; 
1

你有幾個問題,你req_doSomething功能:

  1. ackHandler是不能爲空的參考。
  2. 您正在嘗試將分配給一個指針引用(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); 
} 
0

細心觀察。 struct中的成員是「IAckHandler *」,而arg在引用IAckHandler的setter函數中收到。你可能想要做的是:

req.ackHandler = &ackHandler; 

問候,

亞提Sagade

0

它看起來好像你必須聲明ackHandler作爲IAckHandler *在結構reqmsg。在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); 
}