티스토리 뷰

190716-2
 

 
- 내일은 컨트롤과 윈도우
 
- 뷰는 Paint() 에서 그린다. Paint()에서는 document를 참고하여 그린다.
 
하나라도 수정이 된다면 SetModifiedFlag(true)를 하면된다.
 

- 새로운 문서(ctrl+n 등)를 했을 때
1. 'DeleteContents()
2. 'OnInitialUpdate()'
 

 
-직렬화
객체
포메터
스트림(파일스트림, 네트워크스트림 등)
 
IO 장치에 입출력을 한다.
 
프로그램을 껏다가 켯을 때 필요한 객체들(객체집합)만 복원하면된다.
복원할 때 어떤 데이터인지를 알려면 해당 정보를 모두 저장해야한다. (모든 정보가 필요하다)
그리고 복원시에 포멧을 보고 알아내어 데이터를 복원해야한다.
시리얼라이즈(직렬화) -> 저장을 할 때는 복원가능한 바이트배열로 만들어진다.
즉, 객체를 복원가능한 바이트 배열로 만드는 작업이다.
 
반대로, 다시 데이터로 가져올 때를 '역직렬화' 라고 한다.
 
어떻게 저장할지 형식을 지정하는것이 formatter이다.

- 직렬화 (파일 저장/불러오기)
// CDrawDoc serialization
 
void CDrawDoc::Serialize(CArchive& ar)
{
    if (ar.IsStoring())
    {
        // TODO: 여기에 저장 코드를 추가합니다.
        int size = m_shapeList.GetSize();
        ar << size;
        for (int i = 0; i < size; i++)
        {
            ar << m_shapeList[i].m_rt;
        }
    }
    else
    {
        // TODO: 여기에 로딩 코드를 추가합니다.
        int size;
        ar >> size;
        for (int i = 0; i < size; i++)
        {
            CRect rt;
            ar >> rt;
            m_shapeList.Add(rt);
        }
    }
}
-스트림 객체 'CArchive& ar' 아카이브 객체 : 파일과 연결된 객체
 
// CDrawDoc serialization
 
void CDrawDoc::Serialize(CArchive& ar)
{
    if (ar.IsStoring())
    {
        // TODO: 여기에 저장 코드를 추가합니다.
        int size = m_shapeList.GetSize();
        ar << size;
        for (int i = 0; i < size; i++)
        {
            ar << m_shapeList[i].m_rt;
            ar << m_shapeList[i].m_shapeType;
            ar << m_shapeList[i].m_pen;
            ar << m_shapeList[i].m_Brush;
 
        }
    }
    else
    {
        // TODO: 여기에 로딩 코드를 추가합니다.
        int size;
        ar >> size;
        for (int i = 0; i < size; i++)
        {
            Shape s;
            ar >> s.m_rt >> s.m_shapeType >> s.m_pen >> s.m_Brush;
            m_shapeList.Add(s);
        }
    }
}
- 도형모양 및 색깔도 저장/불러오기
 
- 순수 가상함수 : 몸체만 갖는 가상함수 오버라이딩 필수
- 다른 언어에서는 abstract 키워드를 클래스 앞에서 붙여서 추상클래스를 나타내지만 c++에서는 순수가상함수를 한개 이상 포함하여 추상클래스를 나타낸다.
 
- cf. 커맨드 패턴 사용시 스위치문 제거가능
 
- 다형성 사용시 delete시 Shape형 delete 되므로 가상 소멸자를 만들어야한다.
 
- 읽을 때는 먼저 타입정보 알고 new로 객체 생성 뒤 Serialize 호출 하면된다.
 
- 전역함수연산자중복 필요
 
- 전역함수연산자중복을 하여 <<를 사용가능하게함.
#CArchive #operator<< #Serialize
- Archive객체가 Shape의 객체가 아니기 때문에 멤버함수로 오버로딩할 수 없다.
즉, 왼쪽(<<연산 에서) 객체가 외부 객체이기 때문에 멤버함수로 오버로딩할 수 없다.
때문에 전역함수로 오버로딩해야한다.
 
 
- 다형성을 이용한 Serialize()
 
- 다형성을 이용한 도형저장 부모타입포인터(Shape*)를 담는 CArray에 자식타입객체를 생성하여 Add한다.
 
- 다형성을 이용한 OnPaint() 발생시 List에 저장된 Shape들에게 Draw 메세지를 보내 각 객체타입에 맞게 오버라이딩된 Draw 함수를 호출함으로써 도형을 그린다.
#oldBrush #newPen #pOldPen #pOldBrush #newBrush
 
- 부모 소멸자를 virtual로 지정하면 자식 소멸자도 virtual로 만들어진다.
이후 delete시 동적 바인딩되어 본인객체에 맞는 소멸(delete)이 이루어진다. (가상테이블에 등록되어 그 테이블을 참조하여 소멸이 이루어 진다.(?))
댓글
댓글쓰기 폼
네이버 이웃추가
«   2020/08   »
            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          
글 보관함