이번 프렌드는 클래스에 대한 프렌드인데 클래스도 프렌드가 될 수 있습니다.
이러면 프렌드 클래스의 모든 멤버 함수는 오리지널 클래스의 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;
}
댓글