private로 선언된 class 변수를 외부에서 조작 하기 위해 사용.
#include <iostream>
class AAA
{
int n;
public:
// SetN이라는 함수에 대해서 friend 선언
friend void SetN( AAA& a, int n );
void PrintN()
{
std::cout << n << std::endl;
}
};
// SetN은 AAA클래스와는 별개의 전역 함수이다.
void SetN( AAA& a, int n )
{
// 하지만 AAA클래스의 private안에 있는 맴버 변수를 수정하고 있다.
a.n = n;
}
void main()
{
AAA a;
// 문제 없이 실행 된다.
SetN(a, 10);
a.PrintN();
}
friend 선언에 대해선 몇가지 더 존재 한다.
전역 함수에 대해 선언도 가능하지
만 클래스 or 클래스 안에 특정 맴버 함수에 대해서도 허용이 가능하다.
클래스에 friend 선언하기
#include <iostream>
class AAA
{
int n;
friend class BBB; // BBB클래스에 대해서 friend 선언
};
class BBB
{
public:
// 외부에서 BBB 클래스를 통해서 AAA클래스의 private의 값을 조정할 수 있다.
void SetAAA_N(AAA& a, int n)
{
a.n = 10;
std::cout << a.n << std::endl;
}
};
void main()
{
AAA aaa;
BBB bbb;
// BBB클래스에서 AAA를 조작
bbb.SetAAA_N(aaa, 10);
}
그리고 마지막으로 friend선언을 맴버 함수만 해주는 것이 존재 하는데
이게 참 까다롭다.
전방 참조도 해줘야 하고,
일단 예제를 보자.
난 솔직히 잘 모르겠다.
friend 선언을 잘 안해서 그런것 일 수도 있지만
알것 같으면서도 애매하다
#include <iostream>
class BBB; // 전방 참조.
// 클래스 AAA는 BBB에 private로 선언된 int n에 대해서 접근을 하고 싶어 한다.
class AAA
{
public:
// 전방 참조가 없으면 BBB가 있는지 조차 모르기 때문에 전방 참조는 꼭 해줘야 한다
// SetBBB_N이라는 함수는 public:을 해주지 않으면
// 정작 BBB에서 friend 선언에 대한 컴파일 오류를 일으킨다.
// friend는 당방향이라는 것을 기억하자.
void SetBBB_N( BBB& a, int n ); // BBB에 n값을 수정하기 위한 함수
};
class BBB
{
int n;
// AAA에 존재 하는 SetBBB_N이라는 함수를 friend 선언
// friend를 해주는 곳에선 public:이든 private: 든 상관없다.
friend void AAA::SetBBB_N( BBB& a, int n );
};
// 함수 또한 클래스 내부에 선언과 정의를 동시에 해주는 것 또한 안된다.
void AAA::SetBBB_N( BBB& a, int n )
{
// BBB 클래스에 n이 있는지 없는지 조차 모르기 때문이다.
a.n = n;
std::cout << a.n << std::endl;
}
void main()
{
AAA aaa;
BBB bbb;
aaa.SetBBB_N(bbb, 10);
}
좀더 많이 배우고 느껴야 겠지만
friend라는건 참 모호하다
뭐든 잘쓰면 좋고 못쓰면 독이지만
이녀석은 그 영향을 더 잘 타는 것 같다.
'프로그래밍 > C++' 카테고리의 다른 글
멤버 이니셜 라이저(member initializer) (0) | 2010.03.23 |
---|---|
복사 생성자, 디폴트 생성자 그리고 디폴트 복사 생성자. (0) | 2010.03.21 |
this 포인터 (0) | 2010.03.21 |
객체 포인터 배열 (0) | 2010.03.21 |
클래스의 활용 (0) | 2010.03.20 |