recursive friend classes

后端 未结 4 1861
情深已故
情深已故 2021-01-17 22:03

Is there any way around this:

class B;

class C { 
 public:
  C() { }
 private:
  int i;
  friend B::B();
};

class B { 
 public:
  B() { }
 private:
  int i         


        
相关标签:
4条回答
  • 2021-01-17 22:31

    You just can't do this. Remove the circular dependency.

    0 讨论(0)
  • 2021-01-17 22:32

    Since you're very selective about friendship (access to specific member functions given to specific classes), the Attorney-Client Idiom may be what you need. I'm not sure how well this will work with constructors, though.

    0 讨论(0)
  • 2021-01-17 22:35

    I realize that this is a really silly idea, but couldn't you—theoretically—accomplish this through inheritance, by making the parent class' constructors friends? The code compiles, at least, questionable though it may be.

    class A {
     public:
      A() { }
     private:
      int i;
    };
    
    class D {
     public:
      D() { }
     private:
      int i;
    };
    
    class B : public A {
     public:
      B() { }
     private:
      friend D::D();
    };
    
    class C : public D {
     public:
      C() { }
     private:
      friend A::A();
    };
    
    0 讨论(0)
  • 2021-01-17 22:46

    According to IBM's documentation (which I realize is not normative):

    A class Y must be defined before any member of Y can be declared a friend of another class.

    So I think the answer is "no".

    Of course, you can use

    friend class B;
    

    ...instead of friend B::B(), but that grants friendship to all of B's members. And you probably already knew that.

    0 讨论(0)
提交回复
热议问题