C++ Chapter 10.4 : 연계, 제휴 관계
카테고리: Cpp
태그: Cpp Programming
인프런에 있는 홍정모 교수님의 홍정모의 따라 하며 배우는 C++ 강의를 듣고 정리한 필기입니다. 😀
🌜 [홍정모의 따라 하며 배우는 C++]강의 들으러 가기!
chapter 10. 객체들 사이의 관계 : 제휴 관계
관계 종류 | 관계를 표현하는 동사 | 관계 형태 | 다른 클래스에 속할 수 있는가? | 멤버의 존재를 클래스가 관리 하는가? |
방향성 |
---|---|---|---|---|---|
연계, 제휴 | Uses-a | 용도 외엔 무관 | Yes | No | 단방향 or 양방향 |
🔔 제휴 관계 설명
Uses-a
환자는 의사로부터 치료를 받고 의사는 환자로부터 치료비를 받는 동등한 입장으로서의 상호 작용 관계
- 다른 클래스에 속할 수 있는가? : 용도 외엔 무관
- 환자 클래스에서 의사 클래스의 멤버를 사용할 일이 있을 때만 가져다 쓰고 그 외엔 무관하다.
- 환자는 여러 의사에게 속할 수 있으며 소속하지 않을 수도 있다.
- 의사는 여러 환자에게 속할 수 있으며 소속하지 않을 수도 있다.
- 환자는 다 나으면 의사를 만날 필요가 없다. 빠질 수도 있음
- 멤버의 존재를 클래스가 관리 하는가? : No
- 다른 클래스에 속하지 않으니 당연한 얘기
- 단방향, 양방향
- 환자는 의사로부터 치료를 받고 의사는 환자로부터 치료비를 받는 동등한 입장으로서의 상호 작용 관계
- 서로가 서로를 제휴하기도 하므로 양방향
- 1:1 뿐만 아니라 1:N 도 가능하다.
🔔 코드
#include <iostream>
#include <vector>
#include <string>
using namespace std;
class Doctor; // ⭐ 전방 선언
class Patient
{
private:
string m_name;
vector<Doctor*> m_doctors; // 이 환자가 제휴하는 의사들
public:
Patient(string name_in)
: m_name(name_in)
{}
void addDoctor(Doctor * new_doctor) // 제휴하는 의사 추가
{
m_doctors.push_back(new_doctor);
}
void meetDoctors() // 제휴하는 의사들 출력
{
for (auto & ele : m_doctors)
{
cout << "Meet doctor : " << ele->m_name << endl;
}
}
friend class Doctor;
};
class Doctor
{
private:
string m_name;
vector<Patient*> m_patients; // 이 의사가 제휴하는 환자들
public:
Doctor(string name_in)
: m_name(name_in)
{}
void addPatient(Patient * new_patient) // 제휴하는 환자들 추가
{
m_patients.push_back(new_patient);
}
void meetPatients() // 제휴하는 환자들 출력
{
for (auto & ele : m_patients)
{
cout << "Meet patient : " << ele->m_name << endl;
}
}
friend class Patient;
};
int main()
{
Patient *p1 = new Patient("Jack Jack");
Patient *p2 = new Patient("Dash");
Patient *p3 = new Patient("Violet");
Doctor *d1 = new Doctor("Doctor K");
Doctor *d2 = new Doctor("Doctor L");
p1->addDoctor(d1);
d1->addPatient(p1);
p2->addDoctor(d2);
d2->addPatient(p2);
p2->addDoctor(d1);
d1->addPatient(p2);
//patients meet doctors
p1->meetDoctors();
//doctors meet patients
d1->meetPatients();
//delets
delete p1;
delete p2;
delete p3;
delete d1;
delete d2;
return 0;
}
- 상호 작용 관계를 위해선
전방 선언
이 필요하다.Patient
클래스가Doctor
클래스보다 먼저 정의되는데,Patient
클래스 입장에서 addDoctor, meetDoctor 함수 정의시Doctor
클래스를 알아야 하므로.
- 두 클래스를 서로의
friend
로 지정해야 한다.- addDoctor, meetDoctor, addPatient, meetPatient 함수에서 서로의 멤버를 사용해야 해서 그냥 클래스 자체를 친구로 지정
- 또한 동등한 자격으로서 상호작용 하는 두 클래스를 하나의 헤더파일에 정의해야할 것 같다.
🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄
댓글남기기