2009-12-01 67 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

在评估实际使用类的第一行之前,编译器需要查看类桥的定义。前向声明足以声明指向类实例的指针,因为这不需要任何类结构的知识。但是,编译器需要类定义来生成用于针对类调用方法的代码。