#include <iostream>
#include <vector>
#include <string>

class Doctor; // forward declaration

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(); // 여기서 바디를 구현하면 doctor에 m_name이 있는지 모른다. (전방선언만 해놓았기 때문)
    
    
    friend class Doctor;
};

void Patients::meetDoctors(); 
    {
        for(auto & ele : m_doctors)
        {
            cout << "Meet doctor : " << ele->m_name << "\n";
        }
    }




class Doctor
{
private:
    string m_name;
	vector<Patient*> m_patients;
    
public:
    DOctor(const int & 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 << "\n";
        }
    }
    
    
    friend class Patient; // 멤버 변수가 너무 많을경우 getname 이런걸 다 구현하기 힘드므로 friend로.
};


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();
    
    delete p1;
    delete p2;
    delete p3;
    
    delete d1;
    delete d2;
    
    return 0;
}