LANG/C++

[C++]04-2.캡슐화(Encapsulation)

혀니리리 2023. 5. 12. 16:26
728x90
#include <iostream>
using namespace std;
class SinivelCap
{
public:
    void Take() const {cout << "콧물이 싹~ 납니다."<< endl;}
};
class SneezeCap
{
public:
    void Take() const {cout << "재채기가 멎습니다."<< endl;}
};
class SnuffleCap
{
public:
    void Take() const {cout << "코가 뻥~ 뚫립니다."<< endl;}
};
class CONTAC600
{
private:
    SinivelCap sin;
    SneezeCap sne;
    SnuffleCap snu;
public:
    void Take() const
    {
        sin.Take();
        sne.Take();
        snu.Take();
    }
};

class ColdPatient
{
public:
    void TakeCONTAC600(const CONTAC600 &cap) const {cap.Take();}
};

int main(void)
{
    CONTAC600 cap;
    ColdPatient sufferer;
    sufferer.TakeCONTAC600(cap);
    return 0;
}

코감기약 하나로 콧물, 재채기, 코 뚫림을 동시에 하게 하는 것

 

캡슐화의 범위를 정하는 일은 쉬운 일이 아님.

안에 있는 내용이 보이면 안되므로 기본적으로 정보은닉을 포함하는 개념이라고도 함..

 

윤성우 C++ p.166 정답

#include <iostream>
using namespace std;

class Point
{
private:
    int xpos, ypos;
public:
    void Init(int x, int y)
    {
        xpos = x;
        ypos = y;
    }
    void ShowPointInfo() const
    {
        cout << "[" << xpos << "," << ypos << "]" << endl;
    }
};

class Circle
{
private:
    int rad;
    Point point;
public:
    void Init(int x, int y, int r)
    {
        rad = r;
        point.Init(x,y);
    }
    void ShowCircleInfo() const
    {
        cout <<"radius: " <<rad <<endl;
        point.ShowPointInfo();
    }
};

class Ring
{
private:
    Circle c1;
    Circle c2;
public:
    void Init(int x1, int y1, int r1, int x2, int y2, int r2)
    {
        c1.Init(x1, y1, r1);
        c2.Init(x2, y2, r2);
    }
    void ShowRingInfo() const
    {
        cout << "Inner Circle Info..." << endl;
        c1.ShowCircleInfo();
        cout << "Outer Circle Info..." << endl;
        c2.ShowCircleInfo();
    }
};

int main(void)
{
    Ring ring;
    ring.Init(1,1,4,2,2,9);
    ring.ShowRingInfo();
    return 0;
}

728x90