c++ 에서 클레스 멤버의 함수 포인터 질문 드립니다...
글쓴이: ko1205 / 작성시간: 목, 2013/05/16 - 12:06오후
C만 가지고 간단한 것 정도만 할수 있는 수준입니다. 최근에 C++을 공부하고 있는데..
win32 윈도우 기본 띄우는걸 클레스 형태로 만들어 보다가 모르는 것이 나와서 질문 드립니다.
클레스를 하나 만들고 거기에 생성자에 윈도우 초기화 함수를 전부 넣고 그냥 run()이라는 맴버 함수에 윈도우를 생성하는 방법을
사용해볼려고 했습니다. wndproc함수도 클래스 맴버 함수로 만들어 넣어서 만들었는데.. 윈도우클래스를 초기화 할때 wndproc함수를 등록할때
에러가 나던대... 일단 여기저기 뒤져서 wndproc 콜백함수를 static 의로 넣어주면 된다고 해서 일단 윈도우를 띄우는것 까지는 성공했습니다.
그런대 왜그런지 이유를 알고 싶습니다. 여기저기 뒤져보니 클래스맴버함수의 함수포인터 사용법이 좀 틀리다고 나오는것 같은데 무슨말인지
이해가 되질 않습니다... 그리고 저런 식으로 콜백함수를 static으로 지정해도 다른 문제가 생기는건 아닌지 원래 저런식으로 사용하는것이 맞는지
고수님들의 한수 부탁드립니다.
application.h
#ifndef _H_APPLICATION_ #define _H_APPLICATION_ #include<Windows.h> class Application { private: HINSTANCE hInstance; HWND hWnd; MSG Message; WNDCLASS WndClass; bool bDone; public: Application(); ~Application(); int run(); static LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); // LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); }; #endif
application.cpp
#include "application.h" #include <iostream> LPCTSTR lpszClass = TEXT("test");; Application::Application() { bDone = false; hInstance = GetModuleHandle(NULL); WndClass.cbClsExtra = 0; WndClass.cbWndExtra = 0; WndClass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); WndClass.hCursor = LoadCursor(NULL,IDC_ARROW); WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION); WndClass.hInstance = NULL; WndClass.lpfnWndProc = Application::WndProc; WndClass.lpszClassName = lpszClass; WndClass.lpszMenuName = NULL; WndClass.style=CS_HREDRAW | CS_VREDRAW; RegisterClass(&WndClass); } Application::~Application() { } int Application::run() { hWnd = CreateWindow(lpszClass,lpszClass, WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT, NULL,(HMENU)NULL,hInstance,NULL); ShowWindow(hWnd, SW_SHOWDEFAULT); while(!bDone) { while(PeekMessage(&Message,NULL,0,0,PM_REMOVE)) { if(Message.message == WM_QUIT) { bDone = true; }else{ TranslateMessage(&Message); DispatchMessage(&Message); } } } return (int)Message.wParam; } LRESULT CALLBACK Application::WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam) { switch(iMessage){ case WM_LBUTTONDOWN: std::cout << "Lbutton Down_ aaaa" << std::endl; return 0; case WM_DESTROY: PostQuitMessage(0); return 0; } return(DefWindowProc(hWnd, iMessage, wParam, lParam)); }
main.cpp
#include "application.h" int main(int argc, char **argv) { Application app; app.run(); return 0; }
Forums:
문제 없습니다. 어떤 것이 문제라고 생각하는지
문제 없습니다. 어떤 것이 문제라고 생각하는지 구체적으로 이야기하시면 짚어드리기 쉽겠네요.
static 멤버함수는 일반 멤버함수와 달리 클래스의
static 멤버함수는 일반 멤버함수와 달리 클래스의 인스턴스가 없어도 실행이 가능합니다.
반면에 일반 멤버함수는 클래스의 인스턴스가 없으면 실행할 수 없습니다.
문법적으로는 간단하게 '함수 포인터'와 '멤버함수 포인터'는 타입이 다르기 때문이라고 할 수 있습니다. 정적 멤버 함수 포인터는 함수 포인터와 타입이 같습니다.
댓글 달기