C++ Chapter 10.4 : 연계, 제휴 관계

Date:     Updated:

카테고리:

태그:

인프런에 있는 홍정모 교수님의 홍정모의 따라 하며 배우는 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;

}

  1. 상호 작용 관계를 위해선 전방 선언이 필요하다.
    • Patient클래스가 Doctor클래스보다 먼저 정의되는데, Patient클래스 입장에서 addDoctor, meetDoctor 함수 정의시 Doctor클래스를 알아야 하므로.
  2. 두 클래스를 서로의 friend로 지정해야 한다.
    • addDoctor, meetDoctor, addPatient, meetPatient 함수에서 서로의 멤버를 사용해야 해서 그냥 클래스 자체를 친구로 지정
  3. 또한 동등한 자격으로서 상호작용 하는 두 클래스를 하나의 헤더파일에 정의해야할 것 같다.


🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기


Cpp 카테고리 내 다른 글 보러가기

댓글 남기기