티스토리 뷰

&, 레퍼런스 연산자 활용

멤버 변수를 int형과 CString 형으로 쓰다가 구조체로 만들거나 데화상자를 띄어 데이터를 변경해야 하도록 클래스를 포장하는 경우 이미 두 변수를 사용하고 있는 코드를 구조체나 클래스에 맞는 형태로 변경해줘야 하는데 그러면 시간이 많이 들고 서식이 길어져 가독성이 떨어지므로 이때 레퍼런스를 사용하면 간단히 해결된다.

<Doc/View 구조에서도 사용 가능한데 이때 주의할 점>

Doc/View 구조에서 데이터가 변경되면 Doc객체의 SetModifiedFlag()를 호출해야 하므로. 레퍼런스로 자동화 처리할 경우 이 부분은 따로 처리해야 한다.

 

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include "MyDialog.h"
class CMFCApplication6View : public CView
{
...
private:
    CMyDialog m_dlg;
    CString& m_str;
    int& m_color;
};
 
CMFCApplication6View::CMFCApplication6View()
    : m_str(m_dlg.m_str), m_color(m_dlg.m_color)
// 레퍼런스 변수는 선언과 동시에 초기화해야 하므로 멤버변수로 사용될때는 생성자에서 초기화해야 한다.
...
};
 
void CMFCApplication6View::OnLButtonDblClk(UINT nFlags, CPoint point)
{
    int result = m_dlg.DoModal();
    if (result == IDOK)
    {
        Invalidate();
    }
    else if (result == 100)
    {
        m_str = L"";
        m_color = 0;
        Invalidate();
    }
// 아래 주석 처리한 코드보다 간결해진다.
 
    /*
    CMyDialog dlg;
    dlg.m_str = m_str;
    dlg.m_color = m_color;
    int result = dlg.DoModal();
    if (result == IDOK)
    {
        m_str = dlg.m_str;
        m_color = dlg.m_color;
        Invalidate();
    }
    else if (result == 100)
    {
        m_str = L"";
        m_color = 0;
        Invalidate();
    }
    */
    CView::OnLButtonDblClk(nFlags, point);
}
cs
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
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