【问题标题】: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
  • 当然,问题是:如果你有两个耦合度如此之高的类,那么你确定你的设计是正确的吗?当然听起来你在某处有一个错误的类边界。

标签: c++ class friend


【解决方案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 类存在某处”。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-11-30
          • 2014-02-07
          • 1970-01-01
          • 1970-01-01
          • 2011-04-17
          • 2021-08-16
          • 2015-10-21
          相关资源
          最近更新 更多