S13161 2022-07-26 01:59 采纳率: 66.7%
浏览 121
已结题

C2079未定义的类问题

假设有以下的文件:
element.h

class element_list;
class element{
  element_list  subelements;
  //......
}

element.cpp

#include "element.h"
#include "element_list.h"
//.....

element_list.h

#include "element.h"
class element_list{
//...
  std::list<element> subs;
}

当必须存在class element与class element_list时,且这两个类互相包含以对方为类型的成员时,用以上的编程方法会造成C2079问题(使用了未定义的class “element_list” , 在文件element.h中)
那么,该怎么避免这样的问题?
(当然我不想用指针,除非指针是唯一解决办法)
(我想过Impl,但是如果其中一个类的返回值是未定义的类呢?)
(我也想过将element_list改为template,并在模板中传入类型element,但是如果这个模板还需要一个参数,且此参数必须继承于element呢?)

  • 写回答

2条回答 默认 最新

  • bostonAlen 2022-07-26 03:35
    关注

    只能用指针和模板,甚至引用都可以。
    指针能确定大小,引用不占用空间,而模板是代码延迟生成机制,所以都是解决方法。
    类(和结构体)是不能相互包含的,原因是类在定义的时候需要知道类的大小,实例化的时候才可以正确分配空间。
    假如类A正常定义,类B中有类A,这也是OK的,因为类A大小已知,类B大小也就已知了。
    假如A中有B,B中有A呢?A和B都不确定大小,好像进入了一个类似死锁的情景。
    A和B都不知道自己实例化对象的时候到底申请多少空间。
    同样结构体也是一样,是不可以相互包含的!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)
编辑
预览

报告相同问题?

问题事件

  • 系统已结题 8月2日
  • 已采纳回答 7月26日
  • 修改了问题 7月26日
  • 创建了问题 7月26日
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部