Programming/C++ STL2013. 3. 15. 23:24
friend는 접근규칙(스코프?) 지정자로 함수와, 클래스에 지정할수 있다.

friend function의 경우 method가 아닌 일반 함수이면서 특정 class에 접근 권한을 지닌다.
아래의 예제에서 friend 함수인 duplicate의 구현 부분은
CRectangle duplicate() 로
CRectangle CRectangle:duplicate() 가 아님을 유의하며
using namespace std;

class CRectangle {
int width, height;
public:
void set_values (int, int);
int area () {return (width * height);}
// friend CRectangle duplicate (CRectangle);
};

void CRectangle::set_values (int a, int b) {
width = a;
height = b;
}

CRectangle duplicate (CRectangle rectparam)
{
CRectangle rectres;
rectres.width = rectparam.width*2;
rectres.height = rectparam.height*2;
return (rectres);
}

int _tmain(int argc, _TCHAR* argv[])
{
CRectangle rect, rectb;
rect.set_values (2,3);
rectb = duplicate (rect);
cout << rectb.area();
return 0;
}

CRectangle 클래스의 friend 함수를 주석으로 제거하면
friend로 예외처리가 되지 않기 때문에 private 변수인 width와 height에 접근할수 없기에
아래와 같은 에러가 발생하게 된다.
 error C2248: 'CRectangle::width' : private 멤버('CRectangle' 클래스에서 선언)에 액세스할 수 없습니다.
 error C2248: 'CRectangle::height' : private 멤버('CRectangle' 클래스에서 선언)에 액세스할 수 없습니다. 

+ 상속받은 클래스의 경우 어떻게 되나 소스를 개조했는데
상속받은 클래스 형으로 새롭게 함수를 정의하면 의미가 없어지고
단순하게 타입캐스팅도 못하고
상속받을 형으로 duplicate2 함수를 만들려고 하면 재귀적이라서 방법이 없고 -_-
아무튼 상속에 대해서는 friend 함수는 의미가 없으려나?




friend class의 경우
해당 class의 instance로 부터의 접근 권한을 허가한다.
위의 예제와 유사한데, class 내에서 다른 클래스에게 허가권을 주는 형식이다.
using namespace std;

class CSquare;

class CRectangle {
int width, height;
public:
int area () {return (width * height);}
void convert (CSquare a);
};

class CSquare {
private:
int side;
public:
void set_side (int a) {side=a;}
// friend class CRectangle;
};

void CRectangle::convert (CSquare a) {
width = a.side;
height = a.side;
}

int _tmain(int argc, _TCHAR* argv[])
{
CSquare sqr;
CRectangle rect;
sqr.set_side(4);
rect.convert(sqr);
cout << rect.area();
return 0;
} 

friend를 주석으로 제거시 conver 함수에서 sqr.a 에 접근할수 없으므로 아래와 같은 에러가 발생한다.
(sqr은 CSqaure class로 side는 private 변수이다. 그렇기에 CRectangle 클래스인 rect에서는 sqr.a를 접근할 수 없다)
 error C2248: 'CSquare::side' : private 멤버('CSquare' 클래스에서 선언)에 액세스할 수 없습니다.

+
이녀석도 상속하면 어떻게 되려나 궁금해지네...

[링크 : http://www.cplusplus.com/doc/tutorial/inheritance/]
Posted by 구차니