加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

相互依赖的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:

In particular,the effects are undefined in the following cases: […]

  • if an incomplete type (3.9) is used as a template argument when instantiating a template component,unless specifically allowed for that component.

这样做的原因(以及可以标准化的原因)是双重的:

>程序只包含类型定义;没有创建对象,没有调用函数,不生成代码.如果我们通过消除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的定义(因为向量保持指向一个元素数组,而不是一个数组).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读