7.1 C++의 프렌드 개념
※ 프렌드 함수를 선언할 수 있는 경우
1) 클래스 외부에 작성된 함수를 프렌드로 선언
2) 다른 클래스의 멤버 함수를 프렌드로 선언
3) 다른 클래스의 모든 멤버 함수를 한번에 프렌드로 선언
1) 클래스 외부에 작성된 함수를 프렌드로 선언
※ 예제 1)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | #include <iostream> using namespace std; class Rect; // forward decalaration. 이 라인이 없으면, 다음 라인에서 Rect를 참조하는 전방 참조(forward reference) 문제 발생 bool equals(Rect r, Rect s); // equals() 함수 선언 class Rect { // Rect 클래스 선언 int width, height; public: Rect(int width, int height) { this->width = width; this->height = height; } friend bool equals(Rect r, Rect s); //프렌드 함수 선언 }; bool equals(Rect r, Rect s) { // 외부 함수 if(r.width == s.width && r.height == s.height) return true; else return false; } int main() { Rect a(3,4), b(4,5); if(equals(a, b)) cout << "equal" << endl; else cout << "not equal" << endl; } | cs |
※ 전방 참조(forward reference)를 해결하기 위해 전방 선언(forward declaration)를 해주었다.
2) 다른 클래스의 멤버 함수를 프렌드로 선언
※ 예제 2)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | #include <iostream> using namespace std; class Rect; class RectManager { // RectManager 클래스 선언 public: bool equals(Rect r, Rect s); }; class Rect { // Rect 클래스 선언 int width, height; public: Rect(int width, int height) { this->width = width; this->height = height; } friend bool RectManager::equals(Rect r, Rect s); // 프렌드 함수 선언 }; bool RectManager::equals(Rect r, Rect s) { // RectManager::equals() 구현 if(r.width == s.width && r.height == s.height) return true; else return false; } int main() { Rect a(3,4), b(3,4); RectManager man; if(man.equals(a, b)) cout << "equal" << endl; else cout << "not equal" << endl; } | cs |
3) 다른 클래스의 모든 멤버 함수를 한번에 프렌드로 선언
※ 예제 3)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | #include <iostream> using namespace std; class Rect; class RectManager { // RectManager 클래스 선언 public: bool equals(Rect r, Rect s); void copy(Rect& dest, Rect& src); }; class Rect { // Rect 클래스 선언 int width, height; public: Rect(int width, int height) { this->width = width; this->height = height; } friend RectManager; // RectManager 클래스의 모든 함수를 프렌드 함수로 선언 }; bool RectManager::equals(Rect r, Rect s) { // r과 s가 같으면 true 리턴 if(r.width == s.width && r.height == s.height) return true; else return false; } void RectManager::copy(Rect& dest, Rect& src) { // src를 dest에 복사 dest.width = src.width; dest.height = src.height; } int main() { Rect a(3,4), b(5,6); RectManager man; man.copy(b, a); // a를 b에 복사한다. if(man.equals(a, b)) cout << "equal" << endl; else cout << "not equal" << endl; } | cs |
※ 프렌드 선언은 클래스 내에 private, public 등 아무 위치에서나 가능하다.
'C++ > C++ 문법' 카테고리의 다른 글
#8-1 상속 (0) | 2018.10.07 |
---|---|
#7-B 연산자 중복 (0) | 2018.10.07 |
#6 함수 중복과 static 멤버 (0) | 2018.10.05 |
#5-B 복사 생성자 (0) | 2018.10.05 |
#5-A 함수와 참조 (0) | 2018.10.04 |