具有彼此指针的朋友类
Posted
技术标签:
【中文标题】具有彼此指针的朋友类【英文标题】:friend classes with pointers to each other 【发布时间】:2010-12-16 12:20:36 【问题描述】:如何创建两个具有指向彼此类类型的成员指针的类,并且可以完全访问彼此的数据?换句话说,我需要两个这样的类:
class A
protected:
B *p;
;
class B
protected:
A *p;
;
我遇到了麻烦,因为我不符合 C++ 约定,显然,A 类不能声明 B 类,因为 B 是在代码后面声明的。
感谢您的帮助
【问题讨论】:
c++ 是朋友可以访问您的私人会员的地方。不得不在这里提一下:P 当然,问题是:如果你有两个耦合度如此之高的类,那么你确定你的设计是正确的吗?当然听起来你在某处有一个错误的类边界。 【参考方案1】:你应该使用前向类声明。
//in A.h
class B; // forward declaration
class A
protected:
B *p;
friend class B; // forward declaration
;
//in B.h
class A; // forward declaration
class B
protected:
A *p;
friend class A; // forward declaration
;
【讨论】:
【参考方案2】:class B;
class A
friend class B;
protected:
B *p;
;
class B
friend class A;
protected:
A *p;
;
请注意,任何实际使用 B 的成员的 A 的成员函数都必须在 B 的定义之后定义,例如:
class B;
class A
friend class B;
protected:
B *p;
A *getBA();
;
class B
friend class A;
protected:
A *p;
;
A *A::getBA() return p->p;
【讨论】:
【参考方案3】:您必须使用前向声明,例如:
class B;
class A
...
friend class B;
;
【讨论】:
谢谢...友谊呢?【参考方案4】:class A
protected:
class B *p;
;
如果要声明友谊,需要前向声明:
class B;
class A
friend class B;
protected:
B *p;
;
【讨论】:
IMO 不值得一票否决,但在第二个示例中,您实际上并不需要单独的前向声明。您可以使用friend class B
和class B *p
,并省略第一个class B;
。
@Steve 是的,你是对的。不知道我在想什么。【参考方案5】:
class B;
class A
protected:
B *p;
friend class B;
;
class B
protected:
A *p;
friend class A;
;
【讨论】:
这段代码是否允许 A 类使用 B 类中声明的内联函数? @old-school 规则:inline
与函数是否可访问完全无关。
@Old-school 规则:是的,当然。内联与友谊无关【参考方案6】:
您可以通过在 A 类上方执行 class B;
来使用前向声明
【讨论】:
【参考方案7】:简单使用: B类;
class A
protected:
B *p;
friend class B;
;
class B
protected:
A *p;
friend class A;
;
使用 B 类;表示前向声明,这基本上告诉编译器:“B 类存在某处”。
【讨论】:
以上是关于具有彼此指针的朋友类的主要内容,如果未能解决你的问题,请参考以下文章