반응형
반응형
반응형

* 네임 스페이스

 

 : 명칭 부여의 자유를 보장한다.

   네임 스페이스(Name Space)는 말 뜻 그대로 명칭들이 기억되는 영역이며 명칭의 소속 공간이라고 할 수 있다.

 

1. 필요 이유

 

짧고 간단한 프로그램에서 명칭을 작성하는 것은 그리 어려운 일이 아니다. 그러나 프로그램이 복잡해지고 규모가 커질수록 더 많은 명칭이 필요해져서 고유한 이름을 붙이는 일이 점점 더 어려워지고 있다.

게다가 팀 단위로 작업할 때는 혼자서 명칭을 다 만드는 것이 아니며 외부 라이브러리를 가져다 쓰는 일도 흔해져서 우연히 명칭이 충돌하는 일이 잦아졌다.

 

예) Count라는 변수를 쓰고 싶은데 팀의 다른 개발자가 이미 이 명칭을 전역 변수로 쓰고 있다거나 외부 라이브러리에서 다른 의미로 사용중이라면 이 이름을 쓸 수 없다.

 

2. 형식

 

namespace 이름

{

          여기에 변수나 함수를 선언한다.

}

 

 

3. 적용 사례

 

1) 문제점 발생

: namespace1

#include <Turboc.h>

 

int i;

double i;

void func()

{

     i=123;        // 어떤 i 인지 중복문제 발생

}

 

void main()

{

     func();

}

 

2) 해결안

 

 

: namespace2

#include <Turboc.h>

 

namespace A {

     double i;

}

namespace B {

     int i;

}

void func()

{

     A::i=12.345;

     B::i=123;

}

 

void main()

{

     func();

}

 

 

3) 네임 스페이스의 종류 - 전역(디폴트), 지정이냐

 

=>네임 스페이스를 별도로 정의하지 않아도 항상 존재하는 네임 스페이스가 있는데 이를 전역 네임 스페이스라고 한다. 이른바 디폴트 네임 스페이스라고 볼 수 있는데 흔히 전역 변수를 선언하는 영역,그러니까 함수의 바깥쪽이 바로 이 영역이다.

 

: namespace3

#include <Turboc.h>

 

int i;                  // 전역 네임 스페이스 소속

namespace A {

     int i;             // A 소속

}

 

void func()

{

     int i;

 

     i=1;              // 지역 변수 i

     ::i=2;            // 전역 네임 스페이스의 i

     A::i=3;          // A 네임 스페이스의 i

}

 

void main()

{

     func();

}

 

 

2. 네임 스페이스 사용 (좀더 간편한 방식)

 

=> 네임 스페이스는 명칭의 선언 영역을 분리하여 명칭의 충돌을 방지한다. 그래서 네임 스페이스안에 명칭을 선언하면 이름을 붙일 때 충돌을 걱정하지 않고 자유롭게 이름을 붙일 수 있다.

 

=>이렇게 작성된 명칭을 사용하려면 매번 소속을 밝히고 참조해야 하므로 무척 번거롭다. 다음과 같이 선언된 네임 스페이스가 있다고 하자.

 

1) using 지시자 - 전체 다 가져오기 : using 지시자

 

using namespace 다음에 네임 스페이스를 지정하는 방식이다. 지정한 네임 스페이스의 모든 명칭을 이 선언이 있는 영역으로 가져와 소속 지정없이 명칭을 바로 사용할 수 있도록 한다.

 

: usingdirective

#include <Turboc.h>

 

namespace MYNS {

     int value;

     double score;

     void func() { printf("I am func\n"); }

}

 

using namespace MYNS;           // 네임 스페이스의 모든 명칭을 이 선언으로 가져온다.

 

void main()

{

     value=3;

     score=1.2345;

     func();

}

 

 

2) 변수 하나만 가져오기  : using 선언

 

: usingdecl

#include <Turboc.h>

 

namespace MYNS {

     int value;

     double score;

     void func() { printf("I am func\n"); }

}

 

void main()

{

     using MYNS::value;    // using 선언

 

     value=3;

     MYNS::score=1.2345;

     MYNS::func();

}

 

void subfunc()

{

     MYNS::value=3;

}

 

  

3) 사용에 대한 추천

 

가급적이면 using 지시자로 네임 스페이스의 전체 명칭을 가져 오는 것보다 using 선언으로 꼭 필요한 것만 가져오는 것이 더 좋다.

 

 

3. 별명의 사용

 

네임 스페이스는 우연한 충돌을 방지하기 위해 보통 긴 이름을 주는데 이름이 너무 길면 입력하기에 번거롭고 코드도 지저분해진다. 이럴 경우 namespace 키워드 다음에 A=B; 형태로 긴 이름 대신 짧은 별명을 정의할 수 있다. 별명은 동일한 대상에 대한 다른 이름이므로 이후 B라는 이름 대신 A를 대신 사용하면 된다. 다음 예를 보자.

 

namespace VeryVeryLongNameSpaceName {

     struct Person { };

}

 

void main()

{

     namespace A=VeryVeryLongNameSpaceName;

     A::Person P;

}

 


반응형

'프로그래밍 > MFC' 카테고리의 다른 글

클래스 계층 구조  (0) 2009.02.11
SDI 함수 호출순서(생성시)  (0) 2009.02.11
Dialog의 생성 순서  (0) 2009.02.11
메세지맵 Class :: CCmdTarget  (0) 2009.02.11
DB 사용하기..  (0) 2009.02.11
반응형

반응형

'프로그래밍 > MFC' 카테고리의 다른 글

namespace  (0) 2009.02.11
SDI 함수 호출순서(생성시)  (0) 2009.02.11
Dialog의 생성 순서  (0) 2009.02.11
메세지맵 Class :: CCmdTarget  (0) 2009.02.11
DB 사용하기..  (0) 2009.02.11
반응형

CTestApp()
      CTestApp::InitApplication()
      CTestApp::InitInstance()
      AddDocTemplate()
      ParseCommandLine()
      ProcessShellCommand()

CTestDoc::CTestDoc()
CMainFrame::CMainFrame()
CMainFrame::LoadFrame()
CMainFrame::PreCreateWindow()
CMainFrame::PreCreateWindow()
CMainFrame::PreSubclassWindow()
CMainFrame::OnCreate() - Call
      CMainFrame::OnCreateClient() - Call
            CTestView::CTestView()
            CTestView::Create() - Call
                  CTestView::PreCreateWindow()
                  CTestView::PreSubclassWindow()
                  CTestView::OnCreate() - Called
                  CTestView::OnCreate() - Return
                  CTestView::OnShowWindow() - Call
                  CTestView::OnShowWindow() - Return
            CTestView::Create() - Return
      CMainFrame::OnCreateClient() - Return
      CMainFrame - m_wndToolBar.CreateEx
      CMainFrame - m_wndStatusBar.Create
CMainFrame::OnCreate() - Return
CTestDoc::OnNewDocument()
CTestView::OnInitialUpdate() - Call
CTestView::OnInitialUpdate() - Return

 Initialize OK!! --------------------------------------

CMainFrame::OnActivateApp() - Call
CMainFrame::OnActivateApp() - Return
CMainFrame::OnActivate() - Call
CMainFrame::OnActivate() - Return
CMainFrame::OnShowWindow() - Call
CMainFrame::OnShowWindow() - Return

### CTestApp::Run() - Call ###

 

 

* Application Program Close ----------------------------

CMainFrame::OnClose() - Call
      CMainFrame::OnShowWindow() - Call
      CMainFrame::OnShowWindow() - Return
      CMainFrame::OnActivate() - Call
      CMainFrame::OnActivate() - Return
      CMainFrame::OnActivateApp() - Call
      CMainFrame::OnActivateApp() - Return
      CMainFrame::DestroyWindow() - Call
            CMainFrame::OnDestroy() - Call
            CMainFrame::OnDestroy() - Return
            CTestView::OnDestroy() - Call
            CTestView::OnDestroy() - Return
                  CTestView::PostNcDestroy() - Call
                        CTestView::~CTestView()
                  CTestView::PostNcDestory() - Return
            CMainFrame::OnNcDestroy() - Call
                 CMainFrame::PostNcDestroy() - Call
                        CMainFrame::~CMainFrame()
                  CMainFrame::PostNcDestroy() - Return
            CMainFrame::OnNcDestroy() - Return
      CMainFrame::DestroyWindow() - Return
      CTestDoc::~CTestDoc()
 CMainFrame::OnClose() - Return
 CTestApp::ExitInstance()

### CTestApp::Run() - Return ###

반응형

'프로그래밍 > MFC' 카테고리의 다른 글

namespace  (0) 2009.02.11
클래스 계층 구조  (0) 2009.02.11
Dialog의 생성 순서  (0) 2009.02.11
메세지맵 Class :: CCmdTarget  (0) 2009.02.11
DB 사용하기..  (0) 2009.02.11
반응형
MFC Dialog의 생성 순서
 
가끔씩 MFC의 DialogBase의 class를 만들 경우 기본적으로 호출되는 함수들의 순서가 궁금해서
정리해 둔다.

함수의 호출 순서가 예매한 4개의 함수의 호출 순서는
  1. Dialog class의 생성자 함수
  2. OnSize함수
  3. OnInitDialog함수
  4. OnPaint함수

여기에서 주목해야 할 부분은 InitDialog를 하기 전에 OnSize가 호출된다는 사실이다.

OnSize를 할 경우에는 OnInitDialog의 실행 여부를 확인하고 원하는 작업을 수행해야 한다.


반응형

'프로그래밍 > MFC' 카테고리의 다른 글

클래스 계층 구조  (0) 2009.02.11
SDI 함수 호출순서(생성시)  (0) 2009.02.11
메세지맵 Class :: CCmdTarget  (0) 2009.02.11
DB 사용하기..  (0) 2009.02.11
SDI 기반에서..  (0) 2009.02.11
반응형

CCmdTarget Class

 

MFC 라이브러리 메시지 맵 아키텍처를 위한 base 클래스.

 

class CCmdTarget : public CObject

 

요약

메시지 맵은 명령어 혹은 메시지를 멤버 함수에 전달 한다. (명령어는 메뉴 아이템, 버튼, 단축키로 부터 온 메시지이다) CCmdTarget를 상속받은 중요한 플레임워크 클래스는 CView, CWinApp, CDocument, CWnd, CFrameWnd 등이 있다. 여러분이 메시지를 처리하기 위해 새로운 클래스를 만들었다면 이런 CCmdTarget로부터 상속 받은 클래스 중의 하나를 상속 받으면 된다. CCmdTarget 클래스를 직접 상속 받는 경우는 극히 드문 일이 될것이다.

 

command target과 OnCmdMsg 루팅에 대한 개요는 Commenad Targets, Command Routing, Mapping Messages를 보라.

 

CCmdTarget는 모래시계 커서의 표시를 다루는 멤버 함수도 포함하고 있다. 명령이 수행되길 기다리는 동안에 모래시계 커서를 표시하면 된다.

 

메시지 맵과 유사한 디스패치 맵은 OLE automation IDispatch 기능을 expose하기 위해 사용된다. 이 인터페이스를 expose 함으로써, 비주얼 베이직과 같은 다른 어플리케이션이 여러분의 어플리케이션으로 호출될 수 있다.

 

요구사항

afxwin.h

 

반응형

'프로그래밍 > MFC' 카테고리의 다른 글

SDI 함수 호출순서(생성시)  (0) 2009.02.11
Dialog의 생성 순서  (0) 2009.02.11
DB 사용하기..  (0) 2009.02.11
SDI 기반에서..  (0) 2009.02.11
srand(), rand() 함수 설명  (0) 2009.02.11
반응형
// 새로 만들기 할때 DB suppor 로 선택하면 View  에서 m_pSel 변수를 이용해서 사용가능하다.


// 첫번째 레코드 이면 True
m_pSet->IsBOF() 


// 마지막 레코드 이면 True
m_pSet->IsEOF()


// 첫번째 레코드로 이동
m_pSet->MoveFirst()


// 마지막 레코드로 이동
m_pSet->MoveLast()


// 다음 레코드로 이동
m_pSet->MoveNext()


// 이전 레코드로 이동
m_pSet->MovePrev()


// 레코드 삭제
m_pSet->Delete()


// 레코드 추가
m_pSet->AddNew()
m_pSet->m_Variable = Value
m_pSet->Update()


// SDI 가 아닌 Dialog 에서 하거나 직접 RecordSet 을 상속받아서 할때에는 아래와 같이 직접 사용
ClassName variable;
variable.open()
variable.close()

반응형

'프로그래밍 > MFC' 카테고리의 다른 글

Dialog의 생성 순서  (0) 2009.02.11
메세지맵 Class :: CCmdTarget  (0) 2009.02.11
SDI 기반에서..  (0) 2009.02.11
srand(), rand() 함수 설명  (0) 2009.02.11
CString, Int, Double 변수들 변환  (0) 2009.02.11
반응형
// 한 프로그램에서 실행된 Frame
CMainFrame* pFrm  = (CMainFrame*) AfxGetMainWnd(); 


// 활성화 되어 있는 View
CMyBankView* pView = (CMyBankView*) pFrm->GetActiveView();


// Document 가져오기 :: View 에서 사용
GetDocument()



ps. 헤더 파일 include 하고 헤더파일에서 에러 날시 해당 class 를 선언해줘야 한다.
반응형

'프로그래밍 > MFC' 카테고리의 다른 글

메세지맵 Class :: CCmdTarget  (0) 2009.02.11
DB 사용하기..  (0) 2009.02.11
srand(), rand() 함수 설명  (0) 2009.02.11
CString, Int, Double 변수들 변환  (0) 2009.02.11
Dialog 에 관련된 것들..  (0) 2009.02.11
반응형

난수라는 것은, 알 수 없는 수입니다.

즉, 사람의 개입 없이, 어떤 숫자를 하나 취하고 싶을 때 사용하는 것이 난수입니다.

 

그런데 C언어에서의 난수는 사실상 난수가 아닙니다.

C언어에는 여러개의 난수표가 존재하며,

이 하나하나의 난수표에는 임의의 숫자들이 아무런 상관관계 없이 나열되어 있죠.

C언어에서의 난수란, 이 난수표 중 하나에서 순서대로 숫자를 하나씩 꺼내는 작업을 말합니다.

순서대로 숫자를 꺼내는 것이지만, 그 숫자들이 아무런 관계가 없이 나열되어 있기 때문에 사람들이 볼 때는 난수처럼 보이는 것이죠.

 

그런데 만약, 프로그램이 실행될 때마다 동일한 난수표에서 난수를 뽑아낸다면 어떻게 될까요?

프로그램이 실행될 때마다 동일한 숫자들이 나타날 것입니다.

따라서, 매번 실행할 때마다 다른 난수표를 선택해야 하겠죠.

 

여기서 난수표를 seed라고 부릅니다.

어떤 난수표에서 숫자를 하나씩 꺼내는 함수가 rand()입니다.

그리고 C언어에 내장되어 있는 여러개의 난수표 중에서 하나를 선택하는 함수가 srand()입니다.

 

매번 실행할 때마다 다른 난수표를 사용하기 위해서 srand()를 먼저 호출하게 되는데요,

이때 srand()의 인자로 어떤 숫자를 넘겨줘야 합니다.

이 숫자가 난수표 번호에 해당하는데요,

매번 다른 난수표 번호를 지정하기 위해서 보통 time()이라는 함수를 사용합니다.

time()은 현재 시간이죠.

매번 실행할 때마다 시간이 다를 것이므로,

srand(time(NULL))은 매번 다른 난수표(seed)를 선택하게 됩니다.

그 다음 rand()를 호출하게 되면 그 난수표에서 하나씩 난수를 꺼내어 리턴해주는 것이죠.

 

rand()를 사용해서 꺼내지는 난수들은 범위가 있습니다.

0 ~ RAND_MAX라는 범위의 숫자들이 리턴되죠.

RAND_MAX의 값은 0x7fff입니다.

10진수로 하면 32767이죠.

따라서 rand()가 리턴하는 값은 0 ~ 32767 사이의 숫자입니다.

 

그런데 우리가 필요한 것이 0 ~ 9까지의 숫자라면 어떻게 해야 할까요?

rand()가 0 ~ 9까지의 난수만 리턴하도록 설정하면 좋을 것입니다.

하지만 앞에서 말한 것처럼, 이미 난수란 것은 입력된 값입니다.

정해져 있다는 것이죠.

따라서 rand()에게 0 ~ 9까지의 숫자만 리턴하라도 설정할 수 없습니다.

그렇기 때문에 우리는, rand()가 리턴하는 0 ~ 32767까지의 숫자를, 다시 0 ~ 9까지의 숫자로 변환해서 써야 합니다.

그러기 위해서 %연산자를 쓰게 됩니다.

%연산자는 나눗셈의 나머지를 취하는 연산자이죠.

우리가 어떤 수를 X라는 값으로 나누게 되면,

그 나머지는 항상 0 ~ X - 1의 수가 되죠?

예를 들어서 어떤 수를 10으로 나누면, 어떤 수를 나누던간에, 그 나머지는 항상 0 ~ 9까지의 숫자가 됩니다.

이 원리를 이용해서 0 ~ 32767까지의 숫자를 0 ~ X - 1까지의 범위로 바꿀 수 있는 것입니다.

위의 코드에서 rand() % 10을 한 것은,

0 ~ 32767까지의 난수를 0 ~ 9까지의 숫자로 변환하기 위한 코드입니다.

 

그런데 우리가 필요한 것이, 임의의 주사위 숫자처럼, 0부터 시작하는 것이 아니라 1부터 시작한다면 어떻게 해야 할까요?

rand % 6 + 1 을 해야 합니다.

나머지 연산자는 항상 0을 포함한 범위만 가능하기 때문에,

1을 더해줘야 하는 것이죠.

1을 더할 것이기 때문에 나눗셈을 할 숫자도 7이 아니라 6로 해야 합니다.

7로 나누게 되면 0 ~ 6까지의 숫자가 나타나게 되고,

1을 더하면 1 ~ 7까지의 숫자가 나타나게 되죠.

7은 주사위에 없죠.

따라서 6으로 나누고, 그 나머지 0 ~ 5에다가 1을 더해서

1 ~ 6사이의 숫자가 되도록 변환하는 것입니다.


반응형

'프로그래밍 > MFC' 카테고리의 다른 글

DB 사용하기..  (0) 2009.02.11
SDI 기반에서..  (0) 2009.02.11
CString, Int, Double 변수들 변환  (0) 2009.02.11
Dialog 에 관련된 것들..  (0) 2009.02.11
콤보박스에 관련된 것들..  (0) 2009.02.11
반응형
// Int -> CString
str.Format("%d", int형 변수)


// Double -> CString
str.Format("%.2lf", Double형 변수)


// CSting -> Int
_ttoi( CString형 변수 ) 또는 atoi( CString형 변수 )


// CString -> Double
atof( CString형 변수 )


// 변수의 Type 을 알고 싶을때..
typeid( 변수명 )



// typeid( 변수 : 포인터일때 ) return 값이 에러 날때

런타임 에러의 원인은

/GR(런타임 형식 정보 사용)  태그를 속성에 넣어줘야 합니다.


Project-Settings-C/C++-Category(C/C++ Language)- Enable Run-Time Type Information(RTTI)부분 체크해주세여

보통 이부분이 체크되면 실행파일 용량이 증가하는 관계로 디폴트는 체크가 안되어 있어여

코드는 분명 맞는데 계속 에러나서 찾다가 이부분이 문제더군요

반응형

'프로그래밍 > MFC' 카테고리의 다른 글

SDI 기반에서..  (0) 2009.02.11
srand(), rand() 함수 설명  (0) 2009.02.11
Dialog 에 관련된 것들..  (0) 2009.02.11
콤보박스에 관련된 것들..  (0) 2009.02.11
Control List 에 관련 된 것들..  (0) 2009.02.11
반응형
// IDC 화면에 보여주기
GetDlgItem(보여줄요소::IDC_LIST)->ShowWindow(true)


// 자기를 호출한 Dlg포인터
(DlgClassName*)GetParent()

반응형

'프로그래밍 > MFC' 카테고리의 다른 글

srand(), rand() 함수 설명  (0) 2009.02.11
CString, Int, Double 변수들 변환  (0) 2009.02.11
콤보박스에 관련된 것들..  (0) 2009.02.11
Control List 에 관련 된 것들..  (0) 2009.02.11
리스트 컨트롤 격자보이기  (0) 2009.02.11

+ Recent posts