디시인사이드 갤러리

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

갤러리 본문 영역

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

임사장(210.109) 2012.03.23 18:05:53
조회 75 추천 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 - -
이슈 [디시人터뷰] 충무로가 주목하는 신예, '세계의 주인' 서수빈 운영자 25/11/24 - -
AD 대학생 필수템! What's in my Bag 운영자 25/11/21 - -
308323 내가 사라져 간다. 하나가 되어 간다. [1] 바보플머(218.155) 12.03.26 38 0
308322 하고 싶은 말이 떠올랐다. 바보플머(218.155) 12.03.26 28 0
308321 디씨메인 - 갤러리 - 갤러리검색 - 디지털 - 프로그래밍 바보플머(218.155) 12.03.26 48 0
308320 글을 쓸 수가 없다. 바보플머(218.155) 12.03.26 31 0
308318 자는시간 제외하고는 학원에서 사는거같다. [3] 생선킹갤로그로 이동합니다. 12.03.26 129 0
308316 메트로 ui 쓰는 프로그램 만들어보려는데요 [5] topandbottom갤로그로 이동합니다. 12.03.26 77 0
308315 이제 질문해도됨? 32bit형과 64bit 형으로 자료형 변경하는거말인데 [2] 김멋져갤로그로 이동합니다. 12.03.26 67 0
308314 입갤해도됨? 김멋져갤로그로 이동합니다. 12.03.26 21 0
308311 얘들아 과연 fread로는 한글 입력받기가 어려운가? [3] 니 코 가 뭐갤로그로 이동합니다. 12.03.26 66 0
308310 이력서 제작 존나 짜증남 [1] [성대아싸]갤로그로 이동합니다. 12.03.26 103 0
308309 c++ 배열을 동적할당과 동시에 초기화하는 법? [6] (121.189) 12.03.26 85 0
308308 [[소수를 못잡음 짜증나게..뭐가 문제여 atoi사용을 잘못 한건가? [10] 클라우딩갤로그로 이동합니다. 12.03.26 88 0
308307 고생하십니다. 복학생 질문 하나만 할게요 ! [3] (59.20) 12.03.26 66 0
308305 얼굴인식 하는형들 나좀 살려줘요ㅠㅠ [2] 류헨진갤로그로 이동합니다. 12.03.26 195 0
308304 기본적인 c언어 부분에대한 질문인데 ... 형들아 [1] 뉴비요(222.232) 12.03.26 71 0
308303 궁금한게, 예전 플스,메가드라이브,세턴,패미컴 이런 게임들도 다 C++로 [2] 야요이갤로그로 이동합니다. 12.03.26 71 0
308302 델파이 2010 드디어 설치 했네;; [1] ㅇㅇ(210.113) 12.03.26 37 0
308301 할일도 없는데 난 야근을 왜해야하는거냐? [3] !김실장!갤로그로 이동합니다. 12.03.25 121 0
308299 프갤은 감춰도 결국은 숙제갤이 되네 ㅋㅋ 야요이갤로그로 이동합니다. 12.03.25 38 0
308296 이것좀봐주세요 ㅠ c언어초보 도와주세요!! [7] 도와주세요(175.124) 12.03.25 87 0
308294 형님들 도와주세요 c++완전기초 공부하고 있는데.... [21] 고독의숲갤로그로 이동합니다. 12.03.25 146 0
308293 비줠 스튜디오 2010 궁금한점 [4] 야요이갤로그로 이동합니다. 12.03.25 70 0
308291 형들 c언어 실행종료되는거 질문좀 [1] 세탁범갤로그로 이동합니다. 12.03.25 60 0
308287 게임개발자 형들 잇음? ㄷㄱ(210.192) 12.03.25 78 0
308286 너무너무급해진짜 멋진형들 잘생긴형들 나좀 도와주면안될까 ㅜ [2] 나제발너무급(175.123) 12.03.25 67 0
308285 c언어 로또 만들기 도와주세요 형들 [1] 1515(1.230) 12.03.25 72 0
308284 개인적으로 실패했던 프로젝트... 아놔콘다갤로그로 이동합니다. 12.03.25 84 0
308283 형님들 도와줘요ㅜㅜ 할거없는데갤로그로 이동합니다. 12.03.25 25 0
308282 자바스크립트 고수형 도와주세요 ㅜㅜ [1] ㅇㄹㄴ(222.100) 12.03.25 104 0
308281 정보처리기사 존내쉽냉 금고래갤로그로 이동합니다. 12.03.25 82 0
308280 프갤엔 제대로된 프로그래머가 없는듯..ㅋㅋㅋㅋㅋㅋㅋㅋ [7] ㅋㅋㅋㅋ(125.141) 12.03.25 230 0
308278 보안전문가 될려면 얼루 가야함? 금고래갤로그로 이동합니다. 12.03.25 80 0
308277 패닉입니다 우와... [3] LASTOR갤로그로 이동합니다. 12.03.25 54 0
308276 c#고수님들 진짜 간단한건데 ㅠ. [1] c#(220.88) 12.03.25 65 0
308275 c언어기초문제인대 어려워요 ㅜㅜ 봐주세요형들 형님들부탁(61.255) 12.03.25 46 0
308274 웹표준과 웹접근성에 대해서 [2] Html갤로그로 이동합니다. 12.03.25 57 0
308273 html5 시대가 오면 전문 자바스크립털 이라는 직종이 생겨나겠지. 홍야(222.237) 12.03.25 108 0
308272 과제 올리는 놈들 답 구해줬으면 최소한 고맙다고 말이라도해야하는거 아니냐 RKRNP갤로그로 이동합니다. 12.03.25 78 0
308271 이클립스 jvm에러 질문점 헤헤헤헤갤로그로 이동합니다. 12.03.25 353 0
308268 토익 800초반 나오는데 더 올려야되나 ???? [5] adsf(211.117) 12.03.25 139 0
308267 프로세스 동기화에 대해 설명좀 해주세요 ㅜㅜ [3] 햐양(61.73) 12.03.25 127 0
308264 또 글 지우고 튀었네 [2] kukyakya(183.107) 12.03.25 60 0
308263 형들 숫자들 사칙연산 이런식으로 해도 계산 되요? [2] c언어짜증나(175.118) 12.03.25 59 0
308261 질문이요 프고수님들!!!!!!! [1] LASTOR갤로그로 이동합니다. 12.03.25 31 0
308260 정전 돋네 생물학(175.115) 12.03.25 23 0
308259 printf와 scanf 둘이 문자열 처리가 다르네 생물학(175.115) 12.03.25 27 0
308258 고졸취업 vs 대학진학 [3] 아라라라(115.41) 12.03.25 221 0
308257 fork() 함수 질문 좀 할께 형들.. [1] 십라라갤로그로 이동합니다. 12.03.25 85 0
308254 리버싱 엔지니어링 강좌나 올릴까... [2] 일일육사사(203.229) 12.03.25 92 0
308253 fopen ofstream 둘중에 효율이 더좋은 함수는? [1] 데이브(182.209) 12.03.25 47 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

디시미디어

디시이슈

1/2