-
20141007 (C++ 정보은닉, 캡슐화, 생성자, 소멸자, 비디오처리)부산IT학원/스마트컨트롤러 2014. 10. 7. 11:12
153일차
-----------
C++
-----------
------- 정보은닉, 캡슐화
--- 정보은닉
정보은닉은 말 그대로 외부에 정보를 숨기는 역할이다.
class 내에 접근 지시자로 private와 const 함수가 이에 해당한다.
예제)
class Rectangle
{
private:
Point upLeft;
Point lowRight;
public:
bool InitMembers(const Point &ul, const Point &lr);
void ShowRectInfo() const;
};
클래스 내에 변수들은 private로 외부에서 접근 가능하지 못하고,InitMembers라는 함수를 통해서만 수정이 가능하게 만들어 놓았다.ShowRectInfo() 함수 선언 뒤에 const 가 선언되어 있는데,이 함수는 내부 데이터를 읽기만 한다는 뜻이다.
만약 이 함수에서 데이터를 쓰는 코드가 들어 있을 시, 컴파일때 에러 처리가 된다.
또 const 함수 내에서 다른 함수를 호출시 그 함수도 const 옵션이 붙어 있어야만
호출이 가능하지, 붙지 않으면 이것 또한 컴파일시 에러 처리가 된다.
--- 캡슐화
예를 들어 함수 1, 2, 3 이 있는데 1 -> 2 -> 3 순으로 실행 되어야만 기능이 제대로 되는 함수라 하자.
그런데 프로그래머가 작성 중 이걸 잊어버리고 잘 못 코딩 할 경우 이것을 방지해 주는 역할이다.
예제)
#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()
{
CONTAC600 cap;
ColdPatient sufferer;
sufferer.TakeCONTAC600(cap);
return 0;
}
위의 예제를 통해 보았듯이 이 클래스를 실행하면 항상
콧물 -> 재채기 -> 코 뻥.. 순으로 실행이 된다. 이런 것을 캡슐화라한다고 한다.
정보은닉이나 캡슐화나 프로그래머들이 소스 작성 시
에러를 줄여 안전성을 높이기 위한 기능이다.
------- 생성자, 소멸자
생성자는 클래스의 객체 생성시 실행시켜주는 함수?이다.
예제)
class smart
{
public:
int * ip;
};
int main()
{
smart obj1;
smart obj2;
smart obj3;
obj1.ip = 0;
obj2.ip = 0;
obj3.ip = 0;
return 0;
}
위의 예제에서 항상 smart 객체 생성시 ip 값에 0으로 초기화를 해줘야 하는데
매번 해 주기도 개체수가 많아진다면 엄청난 일이 되어 버린다.
그래서 다음과 같이 생성자를 만들어 준다.
class smart
{
public:
int * ip;
public:
smart()
{
ip = 0;
}
};
int main()
{
smart obj1;
smart obj2;
smart obj3;
return 0;
}
이렇게 하고나면 객체가 만들어 지는 즉시 smart()라는 생성자를 실행시켜
초기화를 해준다.
생성자는 클래스 이름과 같게 만들고 함수로 치자면 리턴 타입이 없다.
--- 소멸자
소멸자는 객체가 사라질때 호출되는 함수?이다.
예제)
#include <iostream>
using namespace std;
class smart
{
public:
int * ip;
int iNum;
public:
smart() // default 생성자라 부른다
{
iNum = 0;
cout << iNum << "Default 생성자 호출" << endl;
ip = new int;
}
smart(int iNum) // default 생성자가 아님
{
smart::iNum = iNum;
cout << iNum << "생성자 호출" << endl;
ip = new int;
}
~smart() // 소멸자
{
cout << iNum << "소멸자 호출" << endl;
delete ip;
}
};
int main()
{
smart obj1(1);
smart obj2(2);
smart obj3(3);
smart obj4;
/*
obj1.ip = 0;
obj2.ip = 0;
obj3.ip = 0;
*/
/* obj1.iNum = 1;
obj2.iNum = 2;
obj3.iNum = 3;
*/
cout << "-----------------------------------------------" << endl;
return 0;
}
결과
--------------
영상 처리
--------------
#include <windows.h>
#include "vfw.h"
#pragma comment(lib, "vfw32.lib")
#define BITMAP_MAXSIZE (1024*768*3+10)
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HINSTANCE g_hInst;
HWND HWndMain;
LPCTSTR lpszClass=TEXT("WiseCat");
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance
,LPSTR lpszCmdParam,int nCmdShow)
{
HWND hWnd;
MSG Message;
WNDCLASS WndClass;
g_hInst = hInstance;
WndClass.cbClsExtra=0;
WndClass.cbWndExtra=0;
WndClass.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
WndClass.hInstance=hInstance;
WndClass.lpfnWndProc=WndProc;
WndClass.lpszClassName=lpszClass;
WndClass.lpszMenuName=NULL;
WndClass.style=CS_HREDRAW | CS_VREDRAW;
RegisterClass(&WndClass);
hWnd=CreateWindow( lpszClass
,lpszClass
,WS_OVERLAPPEDWINDOW
,CW_USEDEFAULT
,CW_USEDEFAULT
,CW_USEDEFAULT,CW_USEDEFAULT
,NULL
,(HMENU)NULL
,hInstance
,NULL);
ShowWindow(hWnd,nCmdShow);
while(GetMessage(&Message,NULL,0,0))
{
TranslateMessage(&Message);
DispatchMessage(&Message);
}
return (int)Message.wParam;
}
LRESULT CALLBACK FramInfo(HWND, LPVIDEOHDR);
HWND vfw;
BITMAPINFO Bm;
HDC hdc;
BITMAPFILEHEADER * stpBFH;
BITMAPINFOHEADER * stpBIH;
unsigned char * BMbuf;
unsigned int uiPad;
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
HANDLE hFile;
PAINTSTRUCT ps;
static unsigned int uiX;
static unsigned int uiY;
DWORD dwRead;
switch(iMessage)
{
case WM_CREATE:
HWndMain = hWnd;
// Bitmap 열고 처리 //시작---------------------------------------------
hFile = CreateFile(TEXT("image.bmp"),
GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if(INVALID_HANDLE_VALUE != hFile)
{
BMbuf = (unsigned char *)malloc(BITMAP_MAXSIZE);
ReadFile(hFile, BMbuf, BITMAP_MAXSIZE, &dwRead, NULL);
CloseHandle(hFile);
stpBFH = (BITMAPFILEHEADER *)BMbuf;
stpBIH = (BITMAPINFOHEADER *)(BMbuf + sizeof(BITMAPFILEHEADER));
uiX = (unsigned int)(stpBIH->biWidth);
uiPad = uiX%4;
uiY = (unsigned int)(stpBIH->biHeight);
}
// Bitmap 열고 처리 //끝-----------------------------------------------
// 웹캠 설정 // 시작------------------------
vfw = capCreateCaptureWindow( TEXT("CAM")
,WS_CHILD | WS_VISIBLE
,0
,0
,400
,300
,hWnd
,NULL);
capDriverConnect(vfw,0);
capGetVideoFormat(vfw,&Bm,sizeof(Bm));
Bm.bmiHeader.biWidth = 320;
Bm.bmiHeader.biHeight = 240;
capSetVideoFormat(vfw,&Bm,sizeof(Bm));
//capDlgVideoFormat(m_capwnd);
capSetCallbackOnFrame(vfw, FramInfo);
capPreviewRate(vfw, 1);
capPreview(vfw, FALSE);
// 웹캠 설정 // 끝--------------------------
return 0;
case WM_PAINT:
hdc = BeginPaint(hWnd,&ps);
EndPaint(hWnd,&ps);
return 0;
case WM_DESTROY:
free(BMbuf);
PostQuitMessage(0);
return 0;
}
return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}
LRESULT CALLBACK FramInfo(HWND hWnd, LPVIDEOHDR lpData)
{
static int iCntX;
static int iCntY;
static int Jump;
unsigned char * ucpPixel;
// 원본 영상 그리기 // 시작-------------------------------
hdc = GetDC(HWndMain);
StretchDIBits(hdc , 0
, 0
, Bm.bmiHeader.biWidth
, Bm.bmiHeader.biHeight
, 0
, 0
, Bm.bmiHeader.biWidth
, Bm.bmiHeader.biHeight
, lpData->lpData
, &Bm
, DIB_RGB_COLORS
, SRCCOPY);
// 원본 영상 그리기 // 끝---------------------------------
// 영상 정보 편집 // 시작--------------------------------------------
ucpPixel = BMbuf + stpBFH->bfOffBits - 3;
Jump= 0;
for(iCntY = 0; iCntY < Bm.bmiHeader.biHeight ; ++iCntY)
{
for(iCntX = 0; iCntX < Bm.bmiHeader.biWidth ; ++iCntX, Jump += 3)
{
ucpPixel = ucpPixel + 3;
if(lpData->lpData[Jump + 2] > 100)
{
continue;
}
else if(lpData->lpData[Jump + 1] > 100)
{
continue;
}
else if(lpData->lpData[Jump + 0] > 50)
{
lpData->lpData[Jump] = *(ucpPixel + 0); // Blue
lpData->lpData[Jump + 2] = *(ucpPixel + 2); // Red
lpData->lpData[Jump + 1] = *(ucpPixel + 1); // Green
}
}
ucpPixel = ucpPixel + uiPad;
}
// 영상 정보 편집 // 끝----------------------------------------------
// 편집된 영상 그리기 // 시작----------------------------
StretchDIBits(hdc , Bm.bmiHeader.biWidth +20
, 0
, Bm.bmiHeader.biWidth
, Bm.bmiHeader.biHeight
, 0
, 0
, Bm.bmiHeader.biWidth
, Bm.bmiHeader.biHeight
, lpData->lpData
, &Bm
, DIB_RGB_COLORS
, SRCCOPY);
// 편집된 영상 그리기 // 끝------------------------------
ReleaseDC(HWndMain, hdc);
return 0;
}
'부산IT학원 > 스마트컨트롤러' 카테고리의 다른 글
20141010 (C++ this) (0) 2014.10.10 20141008 (C++ 맴버 이니셜라이저) (0) 2014.10.08 20141006 (C++ struct, class) (0) 2014.10.06 20141002 (C++ scope, namespace, bool, reference, new, delete, 비디오 처리 소스만) (0) 2014.10.06 20141001 (C++ inline, 비디오 처리) (0) 2014.10.01