【问题标题】:error C2027 and error C2227错误 C2027 和错误 C2227
【发布时间】:2009-12-01 16:23:38
【问题描述】:

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

错误 C2227:'->receive' 的左侧必须指向类/结构/联合/通用类型

在线*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;
}

【问题讨论】:

  • *connection1->receive(newMessage,2);我知道这条线是不正确的。我想我在发布代码之前尝试了“一切”

标签: c++ visual-studio


【解决方案1】:

前面的帖子都是对的,前向声明是为了防止头文件循环包含。 Bridge 类是前向声明的,因此您可以在 LAN 的类定义中指定该类型的指针。由于指针都具有相同的大小,这没关系。

在使用此类时,编译器必须了解更多有关 Bridge 类的信息,至少要了解它的大小。但是除了有一个名为 Bridge 的类之外,没有其他信息。

解决方案是包含定义 Bridge 的标头(如果这样做,请删除类 Bridge 定义),或者将 LAN::connect() 和 LAN::receive() 的实现单独移动实现文件 LAN.cpp 并在其中包含 Bridge 标头,这可能是干净的解决方案。

【讨论】:

    【解决方案2】:

    使用

    connection1->receive(newMessage,2);
    

    【讨论】:

      【解决方案3】:

      让你遇到麻烦的行如下

      *connection1->receive(newMessage,2);
      

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

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

      【讨论】:

      • 向上移动网桥会导致更多错误,因为网桥类也有 lan 变量。我猜同样的问题。我会尝试移动方法
      【解决方案4】:

      您正在尝试通过调用receive 来使用类Bridge,而没有实际定义Bridge 是什么。您已经前向声明了它,但编译器无法判断它实现了一个名为 receive 的方法。

      另外,它只是connection1-&gt;receive(newMessage,2)

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-01-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-11-17
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多