2009-12-01 197 views
0

我得到 錯誤C2027:使用未定義的類型「橋」錯誤C2027和錯誤C2227

錯誤C2227的:左邊的「 - >收到」必須指向類/結構/聯合/通用

在線* connection1-> receive(newMessage,2);

#include <stdio.h> 
#include <stdlib.h> 
#include <iostream> 
#define MAXHOST 10 
#define MAXPORT 5 
#define MAXLAN 8 
#define MAXBRIDGE 5 
#define MAXLANBRIDGECON 2 

using namespace std; 
class Bridge; 
class Host; 
class Message; 
class Simulation; 
class Lan; 


class Message{ 
////////////// 

}; 


class Host{ 
    Lan * lan1; 
    int id; 

    int nextMessageTime; 
public: 
    ///////// 
}; 

class Lan{ 

    Bridge *connection1, *connection2; 
    int bridgeConnection; 
    Host hostList[MAXHOST]; 
    int id; 
    int hostCount; 
public: 
    void connect(Bridge * const newBridge) 
    { 
     if(bridgeConnection==0) 
     { 
      connection1 = newBridge; 


     } 
     if(bridgeConnection==1) 
     { 
      connection2 = newBridge; 

     } 
     bridgeConnection++; 
    } 
    void receive(Message newMessage){ 

     *connection1->receive(newMessage,2); 


    } 


}; 

class Bridge{ 
///////////////////// 
}; 
void main(){ 
    Simulation newSim; 
    newSim.create(); 

return; 
} 
+0

* connection1-> receive(newMessage,2); 我知道這條線是不正確的。我想我在嘗試「一切」之前,我發佈的代碼 – melih 2009-12-01 16:29:06

回答

2

之前的所有帖子都是正確的,正向聲明用於防止循環包含在頭文件中。 Bridge類是前向聲明的,所以你可以在你的類的LAN定義中指定該類型的指針。由於指針都具有相同的大小,所以可以。

當談到使用這個類時,編譯器必須知道更多關於Bridge類的信息,至少它的大小。但除了有一個名爲Bridge的課程之外,沒有任何信息。

該解決方案將包括定義Bridge的頭(如果您這樣做,刪除類橋定義),或者將LAN :: connect()和LAN :: receive()的實現移動到其中自己的實現文件LAN.cpp,並在那裏包含Bridge頭,這可能是乾淨的解決方案。

0

是讓你陷入困境的線下

*connection1->receive(newMessage,2); 

在這種情況下連接1 Bridge*類型。在定義類型之前有一個指向變量的指針是可以的。但是,在完全定義之前,您不能直接引用該類型。解引用運算符(*)會導致該類型被直接使用。由於它沒有定義,你會得到相應的錯誤信息。

嘗試將Bridge類移到該類之上或將該方法移動到.cpp文件。

+0

移動橋導致更多的錯誤,因爲橋類也有lan變量。同樣的問題,我猜。我會嘗試移動方法 – melih 2009-12-01 16:28:07

0

您試圖通過調用receive來使用類Bridge,但實際上並未定義Bridge是什麼。你已經向前聲明瞭它,但是編譯器不能說它實現了一個叫做receive的方法。

此外,它只是connection1->receive(newMessage,2)

0

問題是當你編寫語句*connection1->receive(newMessage,2);編譯器必須確保receive方法存在於Bridge類中。只要向前申報Bridge,它就無法獲得此信息。在使用之前,您需要提供Bridge的類定義。

0

在評估實際使用類的第一行之前,編譯器需要查看類橋的定義。前向聲明足以聲明指向類實例的指針,因爲這不需要任何類結構的知識。但是,編譯器需要類定義來生成用於針對類調用方法的代碼。