gpt4 book ai didi

c++ - 声明内部类和友元的多个源文件

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:02:21 24 4
gpt4 key购买 nike

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

source1.h:

class A {
class B;
}

source2.h:

class B {
//
}

source3.cpp: //A的实现

source4.cpp: //B的实现

番外:A和B之间的友元是如何体现在这种声明中的?

最佳答案

只要 A 的定义不依赖于 B 是一个完整的类型,这就可以工作。 (所以 A 可以包含对 B 的引用或指针,但不是实际的 B 实例,因为编译器不知道要占用多少空间分配给 B 直到它看到 B 的定义。)

在 source2.h 中,您将通过指定范围来定义您在 source1.h 中声明的类:

class A::B {
// ...
};

在 source4.cpp 中,您还需要指定范围。例如,如果 B 的定义声明了一个什么都不做的无参数构造函数:

A::B::B() { }

它的工作方式与定义任何其他类或类成员完全相同,您只需在 B 前加上 A:: 即可让编译器知道该类在哪里.

我写了一个complete and working example这种技术。

关于“友元”,我认为这意味着访问类/对象成员,嵌套类在任何方向上都没有特殊访问权。1 内部类无权访问外部类的任何成员除了那些它通常可以访问的,并且相同的规则适用于另一个方向。如果希望内部类对外部类中声明的成员具有完全访问权限,则需要向外部类添加显式友元声明。


1 根据标准(ANSI/ISO C++ 11.8.1:“嵌套类的成员对封闭类的成员...”),但在 C++11 中,子类隐含地是父类的友元。一些编译器的行为就好像在父类中声明了隐式友元,即使在 C 中也是如此++03,但这种行为不能被认为是可移植的。为了安全起见,明确声明友元。这在 C++03 和 C++11 上同样有效。

关于c++ - 声明内部类和友元的多个源文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18019940/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com