错误C2027和错误C2227

时间:2009-12-01 16:23:39

标签: c++ visual-studio

我明白了 错误C2027:使用未定义类型'Bridge'

错误C2227:' - >接收'的左边必须指向类/ struct / union / generic类型

on line * 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;
}

6 个答案:

答案 0 :(得分:2)

之前的所有帖子都是正确的,前向声明用于防止在头文件中包含循环。 Bridge类是前向声明的,因此您可以在LAN的类定义中指定该类型的指针。由于指针都具有相同的大小,这是可以的。

当涉及到使用这个类时,编译器必须更多地了解Bridge类,至少它的大小。但除了有一个名为Bridge的类之外,没有其他信息。

解决方案是要么包含定义Bridge的头(如果你这样做,删除类Bridge定义),或者将LAN :: connect()和LAN :: receive()的实现移动到自己的实现文件LAN.cpp并在那里包含Bridge头,这可能是干净的解决方案。

答案 1 :(得分:0)

使用

connection1->receive(newMessage,2);

答案 2 :(得分:0)

让您遇到麻烦的一行是以下

*connection1->receive(newMessage,2);

在这种情况下,connection1的类型为Bridge*。在定义类型之前,可以指向变量。但是,在完全定义之前,您不能使用该类型的直接引用。解除引用运算符(*)导致直接使用该类型。由于未定义,因此您会收到相应的错误消息。

尝试将Bridge类移到此类之上或将方法移动到.cpp文件。

答案 3 :(得分:0)

您试图通过调用Bridge来使用课程receive,而无需实际定义Bridge。你已经向前声明了它,但是编译器无法判断它是否实现了一个名为receive的方法。

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

答案 4 :(得分:0)

问题是当您编写语句*connection1->receive(newMessage,2);时,编译器必须确保receive类中存在Bridge方法。只需向前声明Bridge,就无法获得此信息。在使用之前,您需要提供Bridge的类定义。

答案 5 :(得分:0)

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