为我的疏忽道歉。我不知道如何使用不同的源文件声明内部类的主体。我想要实现的是这样的:
源1.h:
class A {
class B;
}
来源2.h:
class B {
//
}
源3.cpp://Implementation of A
源4.cpp://Implementation of B
额外:这些声明中暗示了A和B之间的友谊吗?
为我的疏忽道歉。我不知道如何使用不同的源文件声明内部类的主体。我想要实现的是这样的:
源1.h:
class A {
class B;
}
来源2.h:
class B {
//
}
源3.cpp://Implementation of A
源4.cpp://Implementation of B
额外:这些声明中暗示了A和B之间的友谊吗?
只要定义A
不依赖于B
完整类型,这将起作用。(因此A
可以包含对 的引用或指针B
,但不是实际实例,因为编译器在看到的定义之前B
不知道要分配多少空间。)B
B
在 source2.h 中,您将通过指定范围来定义您在 source1.h 中声明的类:
class A::B {
// ...
};
在 source4.cpp 中,您还需要指定范围。例如,如果B
的定义声明了一个不执行任何操作的无参数构造函数:
A::B::B() { }
它的工作方式与定义任何其他类或类成员完全相同,您只需要预先A::
让B
编译器知道类在哪里。
我已经写了这个技术的一个完整且有效的例子。
关于我认为意味着访问类/对象成员的“友谊”,嵌套类在任何一个方向上都没有特殊的访问权限。1 内部类不能访问外部类的任何成员,除了它通常可以访问的成员之外,同样的规则适用于另一个方向。如果您希望内部类对外部类中声明的成员具有完全访问权限,则有必要向外部类添加显式朋友声明。
1根据标准(ANSI/ISO C++ 11.8.1:“嵌套类的成员对封闭类的成员没有特殊的访问权限......”)在 C++03 中是这样,但在 C++11子类隐含地是父类的朋友。即使在 C++03 中,一些编译器也好像在父类中声明了隐式友谊,但这种行为不能被认为是可移植的。为了安全起见,明确声明友谊。这在 C++03 和 C++11 上同样适用。
当您的类 A 有成员 B 时,您需要在定义类 A 之前使类定义可见。您应该编写:
// source1.h
#include "source2.h"
class A {
class B b;
};
当您只有一个指向 B 类对象的引用或指针时,前向声明就足够了。
// source1.h
class B;
class A {
class B *b;
};
使用这种方法,您可以在类中定义友谊。
此外,我推荐使关系可见的文件的名称。