相互依赖的C类,由std :: vector持有
发布时间:2020-12-14 00:47:06 所属栏目:百科 来源:网络整理
导读:如果有可能创建两个类,每个都拥有另一个std :: vector,我很好奇.我的第一个猜测是,这是不可能的,因为std :: vector需要一个完整的类型,而不仅仅是一个前向声明. #include vectorclass B;class A { std::vectorB b; };class B { std::vectorA a; }; 我会认为s
如果有可能创建两个类,每个都拥有另一个std :: vector,我很好奇.我的第一个猜测是,这是不可能的,因为std :: vector需要一个完整的类型,而不仅仅是一个前向声明.
#include <vector> class B; class A { std::vector<B> b; }; class B { std::vector<A> a; }; 我会认为std :: vector< B>的声明会导致立即失败,因为此时B的类型不完整.但是,这个在gcc和clang下成功编译,没有任何警告.为什么不会造成错误?
T.C评论说,这实际上是在对标准的变更请求中正在解决的未定义的行为.违反的规则显然是[res.on.functions] 2.5:
这样做的原因(以及可以标准化的原因)是双重的: >程序只包含类型定义;没有创建对象,没有调用函数,不生成代码.如果我们通过消除B的定义(不需要)来简化它,然后尝试创建一个A的实例,它将失败: class B; class A { std::vector<B> b; }; A a; // error: ctor and dtor undefined for incomplete type B. 如预期的那样,也是一个简单的失败 std::vector<B> b; 在这两种情况下,原因在于编译器必须生成代码,而不是仅仅是语法相关的类型声明. 使用向量类型也可以在其他上下文中使用: typedef std::vector<B> BVec; > A类可以被定义,因为Nikolay在他的答案中正确地说出了std :: vector< B>的大小,因此A的成员b的大小不依赖于B的定义(因为向量保持指向一个元素数组,而不是一个数组). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- ruby-on-rails – 使用rspec测试rails控制器
- c# – 对Action方法的两个并行ajax请求排队,为什么?
- XPP3-一个非常快的XML解析器
- 解决 cocos2dx UIWidget 加载速度慢造成的游戏卡顿
- ruby – 如何离开加入Arel?
- ruby-on-rails – 如何在AASM中建立状态级别的守卫
- ruby-on-rails – Rails Rich Association – 覆盖关联模型
- 通用权限管理组件支持SqLite,感谢完善者岩子(250952377)
- 如何强制链接器将字符串数组的const数组存储到flash(而不是
- [Swift通天遁地]三、手势与图表-(3)通过捏合手势放大和缩小