디시인사이드 갤러리

갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

프로그래머님들... 이거 해결해 주시면 굽신굽신 ㅠ singleton문제

임사장(210.109) 2012.03.23 18:05:53
조회 71 추천 0 댓글 4

이틀동안 정말 말도 안되는 문제로 머리 싸매다 질문 남겨봅니다 ㅠ..

우선 

문제가 되는 클래스 부분만 말씀드리겠습니다.


CManager (메니져 클래스) : winMain 에서 선언하며 WndProc(...)에서 CManager.wndProc(...) 함수를 호출합니다.

RESULT CALLBACK winMain::WndProc(...)
{
return c_manager.wndProc(..) 요렇게요..
}

CData (data 관리 클래스) : 싱글턴 클래스 입니다. 어디서든 접근해서 데이터를 조작할수 있습니다.

CAction (data 조작 클래스) : data를 조작하는 클래스 입니다. CData가 싱글턴이라 어디서든 접근할수 있지만 이 클래스가 모든 작업을 할수 있도록 했습니다.

CArea (게임 관련 오브젝트) : 땅따먹기 게임인대 현제 플레이어가 가지고 있는 땅떵어리를 배열로 저장하고 관련된 연산을 하는 클래스 입니다.

우선 관련 클래스는 이정도 이구요..

프로그램이 시작되고..

CManager.WndProc 에 메시지가 전달됩니다.

그리고 WndProc 함수에 WM_CREATE: 가 전달됩니다. 

WM_CREATE:
this->init(GAME_PLAYING_STATE);
....
break;

그럼 CManager의 init(int _gameState) 함수가 실행 되겠지요..

init(..) 함수의 본문입니다.
CData::getInstance()->setGameState(_gameState);
c_stage.init();
c_action.init();

여기서 싱글턴 클래스인 CData::getInstance()가 처음으로 호출되면서 객체가 정의됩니다.

getInstance() 본문을 보여드리기 전에

CData 변수 선언은

CData 클래스 

private: 선언부에 

static CData * c_data;로 선언했습니다.

그리고 getInstance()는

public: 선언부에

static CData * getInstance(); 라고 선언했습니다.

그러면 이제 소스코드로 돌아가서

CData * CData::getInstance()
{
if(c_data == NULL)
{
c_data = new CData;
}
return c_data;
}

getInstance()함수의 정의 이구요..

c_data는 현재 NULL이니 CData의 생성자로 넘어갑니다.

CData::CData()
{
p_Item = new CItem[MAX_ITEM_NUMBER]();
p_Unit = new CUnit[MAX_UNIT_NUMBER]();
p_Background = new CBackGround[MAX_BACKGROUND_NUMBER]();
p_Button = new CBtn[MAX_BUTTON_NUMBER]();
p_Area = new CArea[MAX_AREA_NUMBER]();
......

}

p_Item, p_Uint, p_Background, p_Button 클래스 들은 Area처럼 게임에 쓰이는 오브젝트 들이고
이 4개의 클래스 생성자에서는 Area에 접근하는 일이 없습니다...

Area 클래스가 동적할당 되고 Area 생성자가 실행되는 도중에 문제가 발생합니다.

edgeCounter = 0; 부분에서 오류가 발생하는대요.

edgeCounter는 area.h 파일 즉 클래스 선언부에서 선언된 int형 변수입니다.

여기에 0을 대입하는 순간 문제가 발생하며

생성자 호출이 도중 튕겨 나갑니다.

CData::getInstance()는 WM_CREATE에서 호출되므로

다른 코드가 Area를 건드릴수 있는 가능성이 없구요..

혹시나 싶어서

case WM_NCCREATE:
에서 접근해봐도 이문제가 생기네요...

이 부분에 접근하는 클래스 소스도 붙여넣기 해놓겠습니다.ㅠㅠ

당장 완성시켜야 하는 마감일이 다가오는데.... 기능구현도 못하고 여기서 이러고 있으니 걱정도 되고 미치겠네요.. 

혹시 이런 비슷한 문제 겪으신분.. 댓글 달아 주시면 감사하겠습니다...


----------------------- winMain --------------------------

#include "Header.h"

CManager c_manager; //manager 클래스 선언.

LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam);

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nCmdShow)
{
return CWndClass::MessageLoop(hInstance, hPrevInstance, lpszCmdParam, nCmdShow, WndProc);
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
return c_manager.wndProc(hWnd, iMessage, wParam, lParam);
}

---------------------  CManager -------------------------------
#include "Header.h"

CManager::CManager()
{
//릴리즈 모드하면 CManager 브레이킹 포인트도 패스가 되네요...
//디버깅 모드하면 여기서 브레이킹 포인트가 걸림!
}

CManager::~CManager()
{
}

void CManager::init(int _gameState)
{
//QueryPerformanceFrequency(&freq); 시간 정밀측정 사용 함수(미사용)
//QueryPerformanceCounter(&start);
//경과시간
//QueryPerformanceCounter(&end);
//lapse = (unsigned)((end.QuadPrat - start.QuadPart)/freq.QuadPart);

CData::getInstance()->setGameState(_gameState);
c_stage.init();
c_action.init();
}

void CManager::keyCheck(UINT iMessage, WPARAM wParam, int _gameState)
{
c_action.choiceAction(c_keyInput.DataCheck(iMessage, wParam, _gameState));
}

void CManager::setData()
{
}

LRESULT CManager::wndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
int temp;
switch(iMessage)
{
case WM_CREATE:
this->init(GAME_PLAYING_STATE);
SetTimer(hWnd, 1, 150, NULL);
SetTimer(hWnd, 2, 75, NULL);
CWndClass::getInstance()->setWindowhWnd(hWnd);
CWndClass::getInstance()->setWindowDC(GetDC(hWnd));
return 0;

-------------------- CData -------------------------------


#include "Header.h"
#include "Data.h"

CData * CData::c_data; //static 객체는 .cpp에서 알려줘야 함.

CData::CData()
{
p_Item = new CItem[MAX_ITEM_NUMBER]();
p_Unit = new CUnit[MAX_UNIT_NUMBER]();
p_Background = new CBackGround[MAX_BACKGROUND_NUMBER]();
p_Button = new CBtn[MAX_BUTTON_NUMBER]();
p_Area = new CArea[MAX_AREA_NUMBER]();

for(int i = 0; i < 100; i++)
{
DebugMsg[i] = NULL;
DebugMsg2[i] = NULL;
DebugMsg3[i] = NULL;
}
}

CData::~CData()
{
delete []p_Item;
delete []p_Unit;
delete []p_Background;
delete []p_Button;
delete []p_Area;
delete c_data;
}

CData * CData::getInstance()
{
if(c_data == NULL)
{
c_data = new CData;
}
return c_data;
}

-------------------- CArea ---------------------------------



#include "Area.h"

CArea::CArea(void)
{
memset(FieldArray, 0, sizeof(FieldArray));
//int t = 0;
edgeCounter = 0;  //문제발생.............
}

--------------------------------------------------------------

추천 비추천

0

고정닉 0

0

댓글 영역

전체 댓글 0
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 뛰어난 운동 신경으로 남자와 싸워도 이길 것 같은 여자 스타는? 운영자 25/11/24 - -
AD 대학생 필수템! What's in my Bag 운영자 25/11/21 - -
308073 프로그래밍 완전 초짜인데요 질문하나만 할게요 [1] 잠실빠(116.34) 12.03.23 42 0
308072 웹에서 C/C++ 간단한 코드 돌려볼수 있는 사이트는 없슴? [4] ㅂㅈㄷ(121.162) 12.03.23 85 0
308070 깔끔떤다고 삼항연산 너무 남용하지마라 [6] 호석갤로그로 이동합니다. 12.03.23 158 0
308069 자바스크립트 질문!!! [10] 나나(211.177) 12.03.23 102 0
프로그래머님들... 이거 해결해 주시면 굽신굽신 ㅠ singleton문제 [4] 임사장(210.109) 12.03.23 71 0
308067 아까 지워진 글 [1] ㄴㅁㅇㅎ(203.252) 12.03.23 29 0
308065 맥주는 역시 깡맥주지... [2] SODMaster갤로그로 이동합니다. 12.03.23 59 0
308064 성님들 편돌이 하면서 프밍할수있을까요? [1] 바다왕갤로그로 이동합니다. 12.03.23 58 0
308063 글을 왜 지우지 [4] kukyakya(183.107) 12.03.23 50 0
308062 횽아들 계산기 프로그래밍인데(C언어) [7] ㄴㅁㅇㅎ(203.252) 12.03.23 87 0
308060 이런글 보면 짜증나지 않아?? [3] lol(121.66) 12.03.23 72 0
308059 갤 정전 쩌네 [1] Rustee。갤로그로 이동합니다. 12.03.23 37 0
308058 형들 이거좀 봐주세영 [3] 탱자탱자(61.84) 12.03.23 28 0
308057 바다왕님 [2] Rustee。갤로그로 이동합니다. 12.03.23 26 0
308056 커플 탄생 축하글 Rustee。갤로그로 이동합니다. 12.03.23 34 0
308055 백마로 달린다 .. iljeomobolt갤로그로 이동합니다. 12.03.23 61 0
308053 이 프로그램 어디서 다운받어? ㅠ 조공 有 (오늘부터입문) [3] 바다왕갤로그로 이동합니다. 12.03.23 120 0
308052 아 이베이코리아 면접 이네 ㅠㅠ [1] 쥐옥션(128.134) 12.03.23 120 0
308050 클라우드로 노트북 3대 실시간 동기화.. ㄷㄷㄷ [1] .3(175.198) 12.03.23 83 0
308049 java에서 이제 막 awt들어갔는데 종료하는 법 없음? [6] (125.209) 12.03.23 104 0
308048 닭튀김 수렴공식 ANOMY(218.39) 12.03.23 50 0
308047 php에서 SMS연동 시스템인데 AC_Milan갤로그로 이동합니다. 12.03.23 29 0
308046 메시지 기반 프로그래밍을 좀 생각해봤는데... [5] SODMaster갤로그로 이동합니다. 12.03.23 56 0
308045 완전싸게 어플제작해드려요 [19] AnonyMous갤로그로 이동합니다. 12.03.23 249 0
308044 한컴 이 시부랄 새끼들... ㅋㅋㅋ [1] 아놔콘다갤로그로 이동합니다. 12.03.23 78 0
308043 String클래스의 문자열 합성 규칙에 관한 프로그램이라는데 [1] (125.209) 12.03.23 52 0
308037 java에서 사용자정의패키지 만들기여.. (125.209) 12.03.23 20 0
308036 JAVA에서 클래스 종나 많은데 [1] (125.209) 12.03.23 59 0
308035 형들 옵션메뉴 질문점여 [2] 안드루이드(210.103) 12.03.23 27 0
308034 오예 회사에서 점심 식대도 제공해 준다는데? [3] 올체갤로그로 이동합니다. 12.03.23 119 0
308032 아 속이다 시원하네 ㅋㅋㅋ 담배녀 응징 ㅋㅋ [5] ㅋㅋㅋ(61.74) 12.03.23 116 1
308031 C++ 콘솔프로그램에서 키체크 만드는거 가능한가요? [2] ㅇ_ㅇ(61.255) 12.03.23 38 0
308028 학교 리눅스 과제인데 모르겠어요 ㅠㅠㅠ(진짜 쉬운거) [3] 이과임갤로그로 이동합니다. 12.03.23 63 0
308026 근데 웹은 항상 큰 발전이 없는거 같아 [6] :DGC갤로그로 이동합니다. 12.03.23 117 0
308025 sprintf랑 함수질문좀 드릴게염 [2] 1im1(117.16) 12.03.23 41 0
308023 방문기념... [1] iljeomobolt갤로그로 이동합니다. 12.03.23 40 0
308022 니들 이런거 있나?? ㅋㅋ [4] iljeomobolt갤로그로 이동합니다. 12.03.23 108 0
308021 한달생활비 100만원인데 차끄는건 미친짓일까? [8] NightWish갤로그로 이동합니다. 12.03.23 139 0
308020 씹새들이 그냥 책내용 그대로 카피해서 블로그에 처올리네 [6] DontMeddle갤로그로 이동합니다. 12.03.23 127 0
308017 너네 엄청 사랑하는 여친이 명품백 사달라고 그러면 어쩔거임? [8] 올체갤로그로 이동합니다. 12.03.23 209 0
308015 비도 오고 해서 나 어릴때 좋아하던 노래 올려 본다... [2] iljeomobolt갤로그로 이동합니다. 12.03.23 63 0
308013 그림그리는 프로그램 좋은거 없음? 그림판으로 그리니 힘드네 [1] (165.246) 12.03.23 83 0
308012 왜 js보다 비베가 더 빨리 코딩하는거 같지 ㄹㅇㄴㅁ(211.246) 12.03.23 57 0
308010 자바 조언 급구! [3] JoonLee갤로그로 이동합니다. 12.03.23 87 0
308009 대선때 누구 찍을지 고민되네 [2] ㄹㄹㄹ(211.117) 12.03.23 46 0
308008 20주년.. [2] iljeomobolt갤로그로 이동합니다. 12.03.23 75 0
308007 foreach의 속도상 효율성은? [4] U10갤로그로 이동합니다. 12.03.23 97 0
308006 Visual Studio 2010 필요한 사람은 드림스파크 가서 받으셈 vs2010(118.131) 12.03.23 100 0
308005 게임학원 다니느거 어떻게 생각함??? [2] 근데(118.131) 12.03.23 380 0
308002 html 질문입니다. [5] 나나(211.177) 12.03.23 109 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

디시미디어

디시이슈

1/2