C++如何定义两个互相包含对方实例的struct且无需改为class
不需要将struct改为class即可实现需求,struct和class在C++中仅默认访问权限有差异,前向声明规则完全通用,也不需要嵌套定义结构体。
你原代码的问题核心是结构体定义顺序错误,且你当前的场景不存在逻辑上的完整实例循环嵌套(Room中存储的是std::vector<Dweller>,容器本身的内存大小固定,不依赖元素Dweller的大小),可通过以下方案解决:
C++17及以上版本写法(主流编译器默认兼容)
调整定义顺序+前向声明即可,无需修改成员类型:
#include <vector> #include <string> // 前向声明Dweller结构体 struct Dweller; // 先定义Room,此时仅声明vector<Dweller>不需要Dweller的完整定义 struct Room { int id; int WIDTH = 400; int HEIGHT = 100; std::vector<Dweller> dwellers; float energyconsumed; int property; int floor, roomno; }; // 再定义Dweller,此时Room已经完成定义,可以直接声明Room类型的成员 struct Dweller { int id; int age; std::string name, lastname; Room room; float foodconsume; float waterconsume; };
C++11/14兼容写法
低版本C++标准要求std::vector的元素必须是完整类型,此时需要将Dweller中的Room成员改为智能指针即可:
#include <vector> #include <string> #include <memory> // 前向声明Room结构体 struct Room; struct Dweller { int id; int age; std::string name, lastname; // 用智能指针存储Room实例,不需要Room的完整定义即可声明 std::unique_ptr<Room> room; float foodconsume; float waterconsume; }; struct Room { int id; int WIDTH = 400; int HEIGHT = 100; std::vector<Dweller> dwellers; float energyconsumed; int property; int floor, roomno; };
额外提示
- 你原代码中使用的
typedef struct是C语言的兼容写法,C++中定义结构体不需要额外加typedef,直接使用struct 结构体名即可作为类型调用。 - 如果确实需要两个结构体都包含对方的完整实例,逻辑上不可能实现,编译器无法计算出无限嵌套的内存大小,必须至少将其中一个成员改为指针/引用类型。
内容的提问来源于stack exchange,提问作者guacamoleku
相关产品推荐
相关产品推荐

