【问题标题】:Forward declaration with Inheritance and include | incomplete type or expected class name带有继承的前向声明并包含 |不完整的类型或预期的类名
【发布时间】:2021-06-16 23:16:07
【问题描述】:

有人可以帮忙吗?

假设,我有以下 C++ 文件:

房间.h

#ifndef ROOM_H
#define ROOM_H

#include "Console.h"

...

class Room {
public:
   void room();
};

#endif // ROOM_H

Room.cpp

#include "Room.h"

void Room::room() {
  Console::print();
}

控制台.h

#ifndef CONSOLE_H
#define CONSOLE_H

#include "Room.h"
#include "RoomChild.h"

class Console {
public:
   static void print();
   static void printRoom(Room& room);
   static void printRoomChild(RoomChild& room);
};

#endif // CONSOLE_H

控制台.cpp

#include "Console.h"

void Console::print() {
    ;
}

void Console::printRoom(Room& room) { 
    // print member of room 
}

void Console::printRoomChild(RoomChild& roomChild) { 
    // print member of roomChild 
}

RoomChild.h

#ifndef ROOM_CHILD_H
#define ROOM_CHILD_H

#include "Room.h"
#include "Console.h"

class RoomChild : public Room {
public:
    void roomChild();
};

#endif // ROOM_CHILD_H

RoomChild.cpp

#include "RoomChild.h"

void RoomChild::roomChild() {
    Console::print();
}

我的问题是

有可能让它工作吗?

我试图向每个班级或仅向其中一些班级提出声明。但是,它不起作用并给我... has incomplete typeexpected class-name before '{' token class RoomChild: public Room {

【问题讨论】:

  • 您在类定义后缺少分号。
  • 您有循环包含,这可能会导致各种神秘的错误消息。除了RoomChild.h中的#include "Room.h"之外,您可以删除头文件中的所有包含项
  • 去掉header后,需要在cpp文件中添加一些。
  • 为什么Room.h 中有#include "Console.h"Room.h 不依赖于 Console.h
  • 如果您将 #include "Console.h"Room.h 移动到 Room.cpp,它将起作用。但请注意Roomroom 并不相同。

标签: c++ inheritance include forward-declaration incomplete-type


【解决方案1】:

所有内容都搞砸了。

从不相关的文件中删除多余的包含指令。

在依赖它们的文件上添加包含指令。

Room.h

#ifndef ROOM_H
#define ROOM_H

/* DELETE: because Room.h does not depend on it.
#include "Console.h"
*/

// ...

class Room {
public:
   void room();
};

#endif // ROOM_H

Room.cpp

#include "Room.h"

/* ADD: because Room.cpp does depend on it. */
#include "Console.h"

void Room::room() {
  Console::print();
}

Console.h

#ifndef CONSOLE_H
#define CONSOLE_H

/* DELETE: because Console.h does not depend on them.
#include "Room.h"
#include "RoomChild.h"
*/

class Console {
public:
   static void print();
};

#endif // CONSOLE_H

Console.cpp

#include "Console.h"

void Console::print() {
    ;
}

RoomChild.h

#ifndef ROOM_CHILD_H
#define ROOM_CHILD_H

#include "Room.h"
/* DELETE: because RoomChild.h does not depend on it
#include "Console.h"
*/

class RoomChild : public Room {
public:
    void roomChild();
};

#endif // ROOM_CHILD_H

RoomChild.cpp

#include "RoomChild.h"
/* ADD: because RoomChild.cpp does depend on it. */
#include "Console.h"

void RoomChild::roomChild() {
    Console::print();
}

【讨论】:

  • 谢谢,但如果控制台将依赖于 Room 和 RoomChild 就像编辑过的问题一样?
  • 即使依赖它也能工作!!!!非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-09
  • 2011-06-10
  • 1970-01-01
相关资源
最近更新 更多