我很好奇是否可以创建两个类,每个类都有一个 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;
这两种情况的原因是编译器必须生成代码,而不是仅仅在语法上相关的类型声明。
vector type的使用在其他情况下也是可以的:
typedef std::vector<B> BVec;
类
A
可以定义,因为正如 Nikolay 在他的回答中正确所说,std::vector<B>
的大小,因此A
的大小的成员(member)b
, 不依赖于B
的定义(因为 vector 包含指向元素数组的指针,而不是数组本身)。
关于c++ - 相互依赖的 C++ 类,由 std::vector 持有,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35461561/