2010년/5월
5월13일(protected,상속) API(리소스)
뽀얀햄스터
2010. 5. 13. 12:51
생물 ->동물->척추->포유류->인간->인종->나
나라는 존재는 위에 상위 적 개념을 가지고 있고 일반적인 특성을 가지고 있다.
위로 올라갈수록 많이 추상적이기 때문에 이 추상적인 개념을 객체로써 가져오려고한다.
Tico.h에서 Set_Color(void); 함수를 private로 바꾸었다. 그러면
이제 Set_Color(void)를 private이때문에 가져 쓸수 가 없다
하지만 사용하기 위해서는 Tico클래스가 car클래스를 상속받았기 때문에 사용하려는 Tico클래스에서 다시 public으로 void Set_Color()함수를 선언하고 Tico.c에서 기본 출력을 보았다.
다음은 출력화면이다.
'배고프다' 출력되었다.
부모클래스가 private를 걸어도 자식클래스가 public으로 해서 사용가능하다.
하지만 부모클래스의 함수를 다시 선언해서 사용하는것뿐이다.
여기서 간단한 팁.. 생성자를 private를 하게 되면 어떻게 될까~?
그러면 객체를 생성할수 없다.
이경우는 보통 객체를 생성하지 못하게 하고 안에함수는 생성되어 있다
그럼 클래스를 어떻게 사용할까? .... 바로 static을 통해서 클래스를 일부 사용할수 있게 한다.
객체를 생성할수없게 하는 이런 특별한 경우도 있다.
-오버라이딩-
함수겹쳐서 쓴다는 것
이경우는 부모클래스가 자식클래스에게 상속할때 protected를 선언할경우..
상속되는경우 자식클래스가 부모클래스의 함수를 받는데 자식클래스가 똑같은 이름으로 함수를 지정해서 받을경우 부모클래스의 함수를 그대로 자식클래스가 겹쳐서 사용한다 이경우를 오버라이딩이라고 한다. 우리가 알고 있는 오버로딩과는 조금 틀리지만 오버로딩은 함수이름이 같고 인자가 틀린경우지만 오버라이딩은 다같다.
Tico.c에서 car클래스를 같이 선언해서 오버라이딩 했따.
부모클래스car를 자식클래스상속하는해서 오버라이딩을 사용하게 하는경우
다음 약간 팁이다 만약 클래스 안에서 iPrice와 함수안에 인자가 iPrice로같은경우 만약에 대입을할경우 자기 자신에게하게 된다. 하지만 우리의 의도는 틀릴경우 앞에 자기자신을 가르켜 this->넣는다.
protected car() 생성자경우 Tico가 역시 상속 받을수 있다.
Tico()
:~~~~~~~~
{
}
Tico클래스에서 생성자에서 :car() 하게 되는경우 부모의 생성자를 역시 상속받아서 할수 있다. 단지 이경우 먼저 부모클래스에서 protected로 생성자를 선언해야하고 " "로 받는경우 const를 붙여줘야 한다. 무엇보다도 이렇게 car클래스에서 생성자를 오버로딩으로 하나는 인자 없이 만들고 하나는 protected로 인자있게 만들어서 생성자를 오버로딩을 만들경우 자식 클래스가 부모클래스의 생성자를 받아서 사용하며 이제 자식클래스 객체생성시에 부모생성자를 자동으로 안받고 상속으로 받게 할수 있다.
car 클래스 안에
friend class Tico
할경우 기본적인 접근속성을 없애 준다.
이경우는 c++에서만 가능하다
friend는 클래스도 가능하지만
friend void test();처럼
함수도 접근가능하게 해준다.
이제 car.h 파일을 변수와 enum만빼고 전부 protected로 변경했다.
변수는 당연히 접근못하게 private를 선언하고 enum은 가져써야하니깐 public으로 접근속성을 걸었다. 여기서 변수를 private로 접근을 할수 없게 하는경우 임의적으로 접근가능하게 하게 하는것이 있다. 이것이 바로 friend class Tico 이다 friend함수는 임의적으로 접근속성을 없애주는경우인데..위에 설명처럼 C++에서만 가능하다 객체지향프로그래밍언어중에서 그래서 잘쓰면 좋지만 못쓰면 관리하는데 더어렵다. 뒤죽박이 되기때문이다.
============================================================================================
============================================================================================
-API-
GetModulHandle(NULL);
#include<windows.h>
#include "resource.h"
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM,LPARAM);
HINSTANCE g_hlnst; //전역변수
LPCTSTR lpszClass=TEXT("Menu");//전역변수, 윈도우클래스를 정의하는데 사용, 타이틀바에 표시됨.
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevlnstance,LPSTR lpszCmdParam, int nCmdShow)
//엔트리포인트는 main()이 아니라 WinMain(),이다.
//윈도우를 만들고 화면에 표시하기만 할 뿐, 대부분의 일은 아래의 함수에서 이루어진다.
//WinMain에서 하는 가장 중요한 일은 메인 윈도우를 만드는 일이다.
{
HWND hWnd;
MSG Message;
WNDCLASS WndClass;//만들어질 윈도우의 여러가지 특성을 정의하는 구조체
g_hlnst=hInstance;//메인함수의 첫번째 인자인 hInstance를 전역변수에 대입
WndClass.cbClsExtra=0;//특수한 목적에 사용되는 여분의 공간, 사용하지
WndClass.cbWndExtra=0;//않을 때는 0으로 지정한다.
WndClass.hbrBackground=CreateSolidBrush(RGB(255,255,255));
//(HBRUSH)GetStockObject(BLUE_BRUSH);//배경색상 설정
WndClass.hCursor=LoadCursor(NULL,IDC_ARROW); //커서지정
WndClass.hIcon=LoadIcon(NULL, IDI_APPLICATION); //마우스지정
WndClass.hInstance=hInstance; //클래스를 등록하는 프로그램 번호
WndClass.lpfnWndProc=WndProc; //윈도우의 메시지 처리함수를 지정(여기는 WndProc)
WndClass.lpszClassName=lpszClass;//이름지정, 전역변수를 대입하므로 "First"가 들어감
WndClass.lpszMenuName=MAKEINTRESOURCE(IDR_MENU1);//메뉴지정, NULL이므로 생략
WndClass.style=CS_HREDRAW|CS_VREDRAW; //윈도우의 스타일 정의
RegisterClass(&WndClass);//이런 이런 특성을 가진 윈도우를 앞으로 사용하겠다고 등록함.
//윈도우를 만들려면 윈도우 클래스를 등록한 후 CreateWindow함수를 호출한다.
hWnd=CreateWindow(lpszClass,lpszClass,WS_OVERLAPPEDWINDOW|WS_VSCROLL|WS_HSCROLL|WS_THICKFRAME,CW_USEDEFAULT,CW_USEDEFAULT,
CW_USEDEFAULT,CW_USEDEFAULT, NULL,(HMENU)NULL,hInstance,NULL);
//등록된 클래스를 기본으로 실제 윈도우 생성(메모리에 진입)
//이 함수의 인자들은 위에서 등록한 내용들이 각각의 인자로 들어온다.
//이 함수는 윈도우에 관한 모든 정보를 메모리에 만든후 대표 번호인 윈도우 핸들을 반환한다.
ShowWindow(hWnd,nCmdShow); //화면에 출력하는 함수. //첫번째 인자는 출력하고자 하는 윈도
//우의 핸들이며 CreateWindow함수가 리턴한 값이다. 두번째 인자는 출력하는 방법 지정.
//아래의 While문은 프로그램 메시지를 처리하는 부분이다.
while(GetMessage(&Message,NULL,0,0)) //메시지를 읽어들여서 false가 리턴될때 까지 반복
{
TranslateMessage(&Message); //키보드에 이벤트가 발생하면 그 것을 나타 내 준다.
DispatchMessage(&Message); //받은 메시지를 WndProc함수로 전달한다
//그러면 그 함수에서 메시지를 점검하여 동작하게 된다.
}
return (int)Message.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam, LPARAM lParam)
//사용자와 시스템이 보내오는 메시지를 처리하는 함수. (운영체제에 의해 호출)
{
switch (iMessage)
{
case WM_COMMAND:
switch(LOWORD(wParam))
{
case ID_FILE_MENU1:
MessageBox(hWnd,TEXT("첫 번째 메뉴를 선택했습니다."),TEXT("Menu Demo"),MB_OK);
break;
case ID_FILE_MENU2:
MessageBox(hWnd,TEXT("두 번째 메뉴를 선택했습니다."),TEXT("Menu Demo"),MB_OK);
break;
case ID_FILE_EXIT:
DestroyWindow(hWnd);
break;
}
return 0;
case WM_DESTROY: //사용자가 프로그램을 끝내려고 한다면
PostQuitMessage(0);//이 함수를 호출하여 &message에 FALSE를 리턴한다.
return 0;
}
return(DefWindowProc(hWnd,iMessage,wParam,lParam));//실제로 각 이벤트들이
//수행되는 부분이다. (default이므로 별다른 코드가 필요없다.)
}
#include<windows.h>
#include "resource.h"
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM,LPARAM);
HINSTANCE g_hlnst; //전역변수
LPCTSTR lpszClass=TEXT("StrTable");//전역변수, 윈도우클래스를 정의하는데 사용, 타이틀바에 표시됨.
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevlnstance,LPSTR lpszCmdParam, int nCmdShow)
//엔트리포인트는 main()이 아니라 WinMain(),이다.
//윈도우를 만들고 화면에 표시하기만 할 뿐, 대부분의 일은 아래의 함수에서 이루어진다.
//WinMain에서 하는 가장 중요한 일은 메인 윈도우를 만드는 일이다.
{
HACCEL hAccel;
hAccel=LoadAccelerators(hInstance,MAKEINTRESOURCE(IDR_ACCELERATOR1));
HWND hWnd;
MSG Message;
WNDCLASS WndClass;//만들어질 윈도우의 여러가지 특성을 정의하는 구조체
g_hlnst=hInstance;//메인함수의 첫번째 인자인 hInstance를 전역변수에 대입
WndClass.cbClsExtra=0;//특수한 목적에 사용되는 여분의 공간, 사용하지
WndClass.cbWndExtra=0;//않을 때는 0으로 지정한다.
WndClass.hbrBackground=CreateSolidBrush(RGB(255,255,255));
//(HBRUSH)GetStockObject(BLUE_BRUSH);//배경색상 설정
WndClass.hCursor=LoadCursor(NULL,IDC_ARROW); //커서지정
WndClass.hIcon=LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON1)); //마우스지정
WndClass.hInstance=hInstance; //클래스를 등록하는 프로그램 번호
WndClass.lpfnWndProc=WndProc; //윈도우의 메시지 처리함수를 지정(여기는 WndProc)
WndClass.lpszClassName=lpszClass;//이름지정, 전역변수를 대입하므로 "First"가 들어감
//WndClass.lpszMenuName=TEXT("MyMenu");//메뉴지정, NULL이므로 생략
WndClass.lpszMenuName=MAKEINTRESOURCE(IDR_MENU1);//메뉴지정, NULL이므로 생략
WndClass.style=CS_HREDRAW|CS_VREDRAW; //윈도우의 스타일 정의
RegisterClass(&WndClass);//이런 이런 특성을 가진 윈도우를 앞으로 사용하겠다고 등록함.
//윈도우를 만들려면 윈도우 클래스를 등록한 후 CreateWindow함수를 호출한다.
hWnd=CreateWindow(lpszClass,lpszClass,WS_OVERLAPPEDWINDOW|WS_VSCROLL|WS_HSCROLL|WS_THICKFRAME,CW_USEDEFAULT,CW_USEDEFAULT,
CW_USEDEFAULT,CW_USEDEFAULT, NULL,(HMENU)NULL,hInstance,NULL);
//등록된 클래스를 기본으로 실제 윈도우 생성(메모리에 진입)
//이 함수의 인자들은 위에서 등록한 내용들이 각각의 인자로 들어온다.
//이 함수는 윈도우에 관한 모든 정보를 메모리에 만든후 대표 번호인 윈도우 핸들을 반환한다.
ShowWindow(hWnd,nCmdShow); //화면에 출력하는 함수. //첫번째 인자는 출력하고자 하는 윈도
//우의 핸들이며 CreateWindow함수가 리턴한 값이다. 두번째 인자는 출력하는 방법 지정.
//아래의 While문은 프로그램 메시지를 처리하는 부분이다.
while(GetMessage(&Message,NULL,0,0)) //메시지를 읽어들여서 false가 리턴될때 까지 반복
{
if(!TranslateAccelerator(hWnd,hAccel,&Message))
{
TranslateMessage(&Message); //키보드에 이벤트가 발생하면 그 것을 나타 내 준다.
DispatchMessage(&Message); //받은 메시지를 WndProc함수로 전달한다
//그러면 그 함수에서 메시지를 점검하여 동작하게 된다.
}
}
return (int)Message.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam, LPARAM lParam)
//사용자와 시스템이 보내오는 메시지를 처리하는 함수. (운영체제에 의해 호출)
{
HDC hdc;
PAINTSTRUCT ps;
TCHAR str[256];
switch (iMessage)
{
/* case WM_COMMAND:
switch(LOWORD(wParam))
{
case ID_FILE_MENU1:
MessageBox(hWnd,TEXT("첫 번째 메뉴를 선택했습니다."),TEXT("Menu Demo"),MB_OK);
break;
case ID_FILE_MENU2:
MessageBox(hWnd,TEXT("두 번째 메뉴를 선택했습니다."),TEXT("Menu Demo"),MB_OK);
break;
case ID_FILE_EXIT:
DestroyWindow(hWnd);
break;
}
return 0;
*/
case WM_PAINT:
hdc=BeginPaint(hWnd,&ps);
LoadString(GetModuleHandle(NULL),IDS_STRING101,str,256); //g_hInst대신 GetModuleHandle로 사용가능
TextOut(hdc,10,10,str,lstrlen(str));
EndPaint(hWnd,&ps);
return 0;
case WM_DESTROY: //사용자가 프로그램을 끝내려고 한다면
PostQuitMessage(0);//이 함수를 호출하여 &message에 FALSE를 리턴한다.
return 0;
}
return(DefWindowProc(hWnd,iMessage,wParam,lParam));//실제로 각 이벤트들이
//수행되는 부분이다. (default이므로 별다른 코드가 필요없다.)
}