我正在编译以下代码:
class B;
class A {
A();
friend A B::newAObject();
};
class B {
friend A::A();
public:
A newAObject();
};
这可能看起来很奇怪,但想法是让一个类A
只能由B
类型的对象(可能是一个单例)生成。
问题在于我在这些对象之间创建了循环依赖关系。必须在A
之前定义B
,并且必须在B
之前定义A
。显然前方声明B
不够好,B
必须在A
之前完全定义(反之亦然)。
我该如何解决这个问题?
编辑:实际错误是:在嵌套名称说明符中命名的不完整类型“B”。
注意:这里有另一篇与此相似的帖子:Error: incomplete type used in nested name specifier,但是它很有模板化,令我感到困惑,因此这篇帖子。
答案 0 :(得分:6)
C ++ 2003指出,当访问类的内容时,应该完全定义该类。前瞻声明是不够的。这意味着根本不允许像你这样的循环依赖。
P.S。如果这就是你所需要的,那么宣布整个班级成为朋友应该有效。
顺便说一下,友情规范为类生成前向声明,请看下面的代码:
void F10(C1 &p1);
class C2
{
friend class C1;
};
void F11(C1 **p1);
编译器将为F10
提供语法错误,因为C1未定义,但由于友情规范,F11
将编译正常。这可能听起来很奇怪,但这是在标准中定义的,编译器遵循这一点。