c++ 에서 클레스 멤버의 함수 포인터 질문 드립니다...

ko1205의 이미지

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;
}
익명 사용자의 이미지

문제 없습니다. 어떤 것이 문제라고 생각하는지 구체적으로 이야기하시면 짚어드리기 쉽겠네요.

klara의 이미지

static 멤버함수는 일반 멤버함수와 달리 클래스의 인스턴스가 없어도 실행이 가능합니다.
반면에 일반 멤버함수는 클래스의 인스턴스가 없으면 실행할 수 없습니다.
문법적으로는 간단하게 '함수 포인터'와 '멤버함수 포인터'는 타입이 다르기 때문이라고 할 수 있습니다. 정적 멤버 함수 포인터는 함수 포인터와 타입이 같습니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.