이번 프렌드는 클래스에 대한 프렌드인데 클래스도 프렌드가 될 수 있습니다.

이러면 프렌드 클래스의 모든 멤버 함수는 오리지널 클래스의 private 멤버와 protected 멤버에 접근할 수 있습니다.

class Plorence {
private:
      int age;
public:
      friend class Guest;
};
class Guest {
public:
      int GetAge(const Plorence & plo) {
             return plo.age;
      }
};

Guest클래스에서 Plorence 클래스의 private인 age멤버에 접근하려면 프렌드여야 됩니다.

프렌드로 인하여 Guest 클래스에서 Plorence 클래스의 private,protected멤버에 접근할 수 있습니다.

 

프렌드 멤버 함수

위에서 프렌드는 Guest 클래스의 모든 멤버 함수가 Plorence클래스에 접근할 수 있었습니다.

하지만 Guest 클래스의 특정한 멤버 함수 Plorence클래스의 private,protected멤버에 접근하도록 할 수 있습니다.

하지만 위에서 했던 클래스를 프렌드했던것 보다 약간 까다롭습니다.

class Plorence {
private:
      int age;
public:
      friend int Guest::GetAge();
};
class Guest {
public:
      int GetAge(const Plorence & plo) {
             return plo.age;
      }
};

프렌드 문법상 "friend int Guest::GetAge();"는 맞지만 컴파일 에러가 발생하게 됩니다.

컴파일러가 이 구문을 처리하려면, 컴파일러가 Guest 정의를 미리 알고 있어야 합니다.

반대로 Guest 클래스도 Plorence가 클래스라고 알 수 있어야 합니다.

이러한 해결 방법은 사전 선언(forward declaration)을 사용하는 것입니다.

class Plorence; //클래스 선언
class Guest {
public:
       int GetAge(const Plorence &); //Plorence가 클래스라고 알고 있음
};
class Plorence {
private:
       int age;
public:
       friend int Guest::GetAge(const Plorence &); //위에 Guest 클래스와 GetAge  멤버 함수가 둘다 선언되어 있어서 알 수 있음
};

이때 GetAge 멤버 함수는 인라인으로 정의될 수 없습니다.

왜냐하면 Plorence라는 것이 클래스라고는 알고 있지만(선언), 정의되지는 않았기 때문입니다.

그래서 사용하려면 Plorence클래스 밑에 외부에서 정의를 해줘야 합니다.

Plorence의 멤버인 age가 Guest 클래스의 GetAge에서 접근한다고 하면, age를 모를 겁니다.

lass Plorence; //클래스 선언
class Guest {
public:
       int GetAge(const Plorence &); //Plorence가 클래스라고 알고 있음
};
class Plorence {
private:
       int age;
public:
       friend int Guest::GetAge(const Plorence &); //위에 Guest 클래스와 GetAge  멤버 함수가 둘다 선언되어 있어서 알 수 있음
};
inline int Guest::GetAge(const Plorence & plo) { //GetAge 멤버 함수 정의
       return plo.age;
}

 

 

댓글을 달아 주세요