C++/Class 2021. 3. 16. 00:09

friend

  • 클래스 내부에다가 friend 키워드 다음에 다른 클래스나 함수를 선언하면, 해당 클래스나 함수에서 private 멤버에 접근할 수 있다.

예제

  • 간단한 예제

    #include <iostream>
    
    class A
    {
      int value_ = 1;
    
      friend void doSomething(A& a);
    };
    
    void doSomething(A& a)
    {
      std::cout << a.value_ << std::endl;
    }
    
    int        main()
    {
      A    a;
    
      doSomething(a);
    }
    
    /* stdout
    1
    */
  • 조금 귀찮은 예제

    #include <iostream>
    
    class A;
    
    class B
    {
      int    value_ = 2;
    
    public:
      void doSomething(A& a)
      {
        std::cout << a.value_ << std::endl;  // 에러
      }
    };
    
    class A
    {
      int value_ = 1;
    
      friend class B;
    };
    
    int        main()
    {
      using namespace std;
    
      A    a;
      B    b;
    
      b.doSomething(a);
    }
    error C2027: use of undefined type 'A'
    • class A라고 전방 선언을 해도, class A 내부의 멤버 변수들은 알 수 없으므로 에러가 발생한다.

    • 해결법 : 함수의 정의와 선언을 분리하여 class A의 아래 쪽에 정의한다.

    #include <iostream>
    
    class A;
    
    class B
    {
      int    value_ = 2;
    
    public:
      void doSomething(A& a);
    };
    
    class A
    {
      int value_ = 1;
    
      friend class B;
    };
    
    void B::doSomething(A& a)
    {
      std::cout << a.value_ << std::endl;
    }
    
    int        main()
    {
      using namespace std;
    
      A    a;
      B    b;
    
      b.doSomething(a);
    }

'C++ > Class' 카테고리의 다른 글

C++ Nested Types  (0) 2021.03.16
C++ 익명 객체 (Anonymous Class)  (0) 2021.03.16
C++ 정적 멤버 함수 (Static Member Function)  (0) 2021.03.16
C++ 정적 멤버 변수 (Static Member Variable)  (0) 2021.03.15
C++ static (Class)  (0) 2021.03.15