具有彼此指针的朋友类

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 Bclass 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 类存在某处”。

【讨论】:

以上是关于具有彼此指针的朋友类的主要内容,如果未能解决你的问题,请参考以下文章

通过基类指针C++访问派生类的成员

具有类私有成员和函数指针的继承结构

具有包含另一个类的函数指针的映射的类

指向具有私有构造函数的类的类成员的指针

具有正确地址但具有另一个随机值的 C++ 指针?

表达式必须具有指向类类型的指针