6

为我的疏忽道歉。我不知道如何使用不同的源文件声明内部类的主体。我想要实现的是这样的:

源1.h:

class A {
    class B;
}

来源2.h:

class B {
//
}

源3.cpp://Implementation of A

源4.cpp://Implementation of B

额外:这些声明中暗示了A和B之间的友谊吗?

4

2 回答 2

16

只要定义A不依赖于B完整类型,这将起作用。(因此A可以包含对 的引用或指针B,但不是实际实例,因为编译器在看到的定义之前B不知道要分配多少空间。)BB

在 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 上同样适用。

于 2013-08-02T15:01:46.773 回答
1

当您的类 A 有成员 B 时,您需要在定义类 A 之前使类定义可见。您应该编写:

// source1.h
#include "source2.h"
class A {
    class B b;
};

当您只有一个指向 B 类对象的引用或指针时,前向声明就足够了。

// source1.h
class B;
class A {
    class B *b;
};

使用这种方法,您可以在类中定义友谊。

此外,我推荐使关系可见的文件的名称。

于 2013-08-02T15:02:12.150 回答