C ++将类的引用传递给另一个类

Posted

技术标签:

【中文标题】C ++将类的引用传递给另一个类【英文标题】:C++ Passing Reference of class to another class 【发布时间】:2018-11-28 21:24:48 【问题描述】:

我一直在尝试将我的 Graphics Manager 类传递给我的 Robot 和 Room 类。

但是当试图通过引用传递类时,我得到了 3 个关于通过引用传递的错误。

这些是我所指的错误: C2143 语法错误:缺少 ';'在'*'之前

C4430 缺少类型说明符 - 假定为 int。注意:C++ 不支持 default-int

C2238 ';' 之前的意外标记

我试图改变我通过课程的方式,但没有运气,我突出显示了导致错误的区域以及我试图用来解决问题的代码。

非常感谢任何关于如何解决这些错误的建议。

我没有包含完整的 .cpp 文件,因为它们非常大,但我将包含一个指向带有完整脚本的 pasteBin 的链接。

GraphicsManager.h

#pragma once
#include <iostream>
#include <SFML/Graphics.hpp>
#include "Room.h"
#include "Robot.h"


class GraphicsManager

 public:


Room* room;     //This does not Flag Up Errors 
Robot* robot;   //This does not Flag Up Errors 

Robot.h

#pragma once
#include <iostream>
#include <SFML/Graphics.hpp>
#include <SFML/System/String.hpp>
#include "GraphicsManager.h"
//#include "Room.h" //This what i had
class Room; //This is what i changed
//class GraphicsManager; //Wasnt sure if i should use it this 
//way

class Robot

public:

//Graphics Variables
Room* room;     //This works after the change
Robot* robot;   //This works after the change

GraphicsManager *gm;    //This throughs up the error

//This Is what i attemped to use with no effect
//GraphicsManager* gm = new GraphicsManager(room, robot);

Robot.cpp https://pastebin.com/Xd1A3Vii

#include "Robot.h"




Robot::Robot()


gm = new GraphicsManager(room, robot); //This tells me gm is 
//not declared
this->room = room; //This does not flag up errors
this->robot = robot; //This does not flag up errors

//Room &room = *rm;  // attempted to use this but decided not 
//to


房间.h

#pragma once
#include <SFML/Graphics.hpp>
#include <SFML/System/String.hpp>
#include "GraphicsManager.h" //
//#include "Robot.h"    //what i orginally had
//class GraphicsManager;    //i decided not to do it this way
class Robot;    //What i changed it to 


class Room

public:

//Reference to other classes
Room* room;     //This doesnt throw errors
Robot* robot;   //This doesnt throw errors

//Refference to graphics manager
GraphicsManager *gm; //This throws the three errors mentioned
;

Room.cpp https://pastebin.com/6R6vnVfy

#include "Room.h"



Room::Room()


gm = new GraphicsManager(room, robot);
this->room = room;
this->robot = robot;

【问题讨论】:

它们看起来都是些微不足道的错别字。也许只包括错误所在的行和两边的 3 或 4 行(通常这些类型的错误可能来自报告前几行的错误) ***.com/questions/625799/… 【参考方案1】:

这是经典的循环包含问题。 GrapicsManager.h 包括Room.hRobot.h,它们又分别包括GrapicsManager.h。现在,例如,在编译 GraphicsManager.cpp 时,您将包含 GrapicsManager.h。但是在你得到GraphicsManager 类定义之前,你首先要包含Room.h。从那里你直接再次包含GrapicsManager.h,但由于你有一个#pragma once,编译器将简单地跳过该包含。当编译器到达Room.h 中的GraphicsManager *gm; 成员声明时,从未见过名为GraphicsManager 的类型的声明。然后Visual C++给你的错误信息

C4430 缺少类型说明符 - 假定为 int。注意:C++ 不支持 default-int

可以说有点不直观。在遇到标识符GraphicsManager 时,标识符只能表示声明的开始。由于GraphicsManager 不是已知类型,编译器假定标识符必须是应该声明的实体的名称,而您只是忘记指定类型。这就是为什么您会收到您看到的错误消息。在过去,C 曾经允许您在声明中省略类型说明符,这意味着使用 int 作为默认值。因此,您会在尝试编译古老的非标准 C 代码时看到此错误。这就是错误消息包含不允许这样做的明确注释的原因……

您已经在Robot.h 中为Room 添加了前向声明,在Room.h 中为Robot 添加了前向声明。你必须为GraphicsManager做同样的事情……

【讨论】:

以上是关于C ++将类的引用传递给另一个类的主要内容,如果未能解决你的问题,请参考以下文章

无法将类实例传递给构造函数

将类对象实例作为参数从 main() 传递给另一个类对象实例

如何将类成员变量传递给另一个组件角度?

java向前引用和向后引用是啥概念

无法将类的对象从一个活动传递到另一个活动? [复制]

我可以将类引用作为参数传递给 VB Net 中的函数吗?