我明白了 错误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;
}
答案 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的定义。前向声明足以声明指向类实例的指针,因为这不需要任何类结构知识。但是,编译器需要类定义来生成用于针对类调用方法的代码。