디시인사이드 갤러리

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

갤러리 본문 영역

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

임사장(210.109) 2012.03.23 18:05:53
조회 78 추천 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 따뜻한 겨울나기! 방한용품 SALE 운영자 25/11/27 - -
308220 김포공항에 스터디 할만한곳 아는 횽? 쿄스케갤로그로 이동합니다. 12.03.25 207 0
308219 얘들아 c언어에서 char 포인터로 스트링 입력받는데 말야 [25] 니 코 가 뭐갤로그로 이동합니다. 12.03.25 130 0
308217 월급들어오면, 집에 개발기 만들거다. [8] 어떻해갤로그로 이동합니다. 12.03.25 153 0
308216 독학으로 프로그래밍 언어 공부하고 있는데.. [3] 해피너스갤로그로 이동합니다. 12.03.25 150 0
308215 [조공있엌]안뇽 형들 Java 파일 전송 좀 물어볼겡 111(110.11) 12.03.25 101 0
308214 하... 자꾸와서 미안 [1] 왕초보(59.9) 12.03.25 81 0
308211 횽들 ㅠ 초보가 질문좀할게.. [1] 왕초보(59.9) 12.03.25 49 0
308209 횽들아... 새벽부터 초쳐서 미안한데 ㅠㅠ.. [3] 왕초보(59.9) 12.03.25 61 0
308208 학교숙제하는데 왤케 오래걸리지?? ㅇ벗다갤로그로 이동합니다. 12.03.25 37 0
308207 초소형 컴퓨터 잘 아는 사람? [3] 페고떼찌갤로그로 이동합니다. 12.03.25 139 0
308206 회사에서 나 인턴ㅇ.라고 과제를 막 내줘 Html갤로그로 이동합니다. 12.03.25 130 0
308199 인피니티북스 powerjava cd있는 횽 있어? 자바(14.36) 12.03.25 26 0
308198 C++늅늅 질문좀... [6] KKK(221.140) 12.03.25 112 0
308196 연봉도 잘 따져봐야. [4] qewr(27.35) 12.03.24 233 0
308194 runy on rails 개발자 모집합니다 !! 개발자급구(211.108) 12.03.24 125 0
308192 가끔 대단하게 느껴지는인간들 [2] CHALLENGER갤로그로 이동합니다. 12.03.24 178 0
308190 형들 좆뉴비 C언어 문제 하나만 봐주세여 ㅠㅠ [7] ㅁㄴㅇㄹㄴㅇ(220.72) 12.03.24 99 0
308189 자바 파싱에 대해서 설명 잘된 책이 없을까요 ? 미니미(39.116) 12.03.24 49 0
308186 포인터 문제 풀사람!!!!!ㅋㅋ [3] 농심오발면(180.68) 12.03.24 94 0
308184 야 니들 멀티레벨 피드백 큐라고 들어봤냐? OS임 [2] 멘붕(203.246) 12.03.24 137 0
308183 내머리가병신임? [3] CHALLENGER갤로그로 이동합니다. 12.03.24 71 0
308181 안녕하세요. 한때 프통령으로 군림했었던 형들아입니다. ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ [7] 형들아(59.30) 12.03.24 179 2
308179 이런 알고리즘 없을까 ? [5] 애슐리::그린갤로그로 이동합니다. 12.03.24 112 0
308178 C 강의 첫번째 [2] 돼지맨갤로그로 이동합니다. 12.03.24 57 0
308176 ase 파일에서 Scene 정보에 대해 궁금한게잇는디요 . DontMeddle갤로그로 이동합니다. 12.03.24 273 0
308173 다이렉트X 모르고 바로 언리얼 개발툴 만져도 되나요?? [1] 돼지맨갤로그로 이동합니다. 12.03.24 70 0
308171 링크드리스트 존나 좋네 ㅋㅋㅋㅋ [3] (211.117) 12.03.24 143 0
308170 Lock Free 한 병렬 프로그래밍이 가능할까? [3] SODMaster갤로그로 이동합니다. 12.03.24 82 0
308168 형들아 C## 스위치문 짜고있는데 모르는 부분이있어서 .... C#(122.34) 12.03.24 44 0
308165 Embarcadero RAD Studio XE 어디서 구함? 애슐리::그린갤로그로 이동합니다. 12.03.24 35 0
308164 델파이2010 깔았는데 그다음 실행시키는 법좀 알려주세요..ㅠㅠ ㅇㅇ(210.113) 12.03.24 38 0
308163 젊은 나이에 과로사 ㅡ_ㅡ [2] 쿄스케갤로그로 이동합니다. 12.03.24 182 1
308162 시계추 [2] 쿄스케갤로그로 이동합니다. 12.03.24 94 0
308161 국숭세단 컴공과 학생인데요 컴공 전망 쓰레기인가요? [6] 컴공(58.123) 12.03.24 421 0
308158 c++뉴비가 질문 올리옵니다.. [3] KKK(221.140) 12.03.24 55 0
308157 얘들아 나 담주에 입사면접에서 어플만들고 갈려고 하는데 [13] 농심오발면(180.68) 12.03.24 174 0
308154 고수형들 f1 f3 진리표좀 구해주셍료,..ㅠㅠㅠ [7] ㅇㅇ(203.246) 12.03.24 54 0
308153 스크립트언어 질문점 ㅜ ㅁㄴㅇㄹ(168.115) 12.03.24 37 0
308152 ARM 어셈블리 코드인데 파라미터인가 어떻게 고쳐야됌? 마타버터갤로그로 이동합니다. 12.03.24 71 0
308151 돈벌고 싶다 [5] [성대아싸]갤로그로 이동합니다. 12.03.24 128 0
308150 나누기소수점까지 나오게 할라면 어뜨케합니꽈? [5] 낄럽슨갤로그로 이동합니다. 12.03.24 74 0
308149 ㅠㅠ 이것좀 알려주세요 제발! 플리즈! 어린플머가 선배님들께 도움요청해여 [8] ㅁㄴㅇㅁㄴㅇ(58.148) 12.03.24 63 0
308147 공비 팩토리알 알고리즘이 nlgn보다 빠른가??? 141(203.90) 12.03.24 57 0
308146 코딩용으로 노트북살려는데..;; [17] 내알바아님갤로그로 이동합니다. 12.03.24 271 0
308144 형님들 매트랩 질문좀할꼐여 키오♡갤로그로 이동합니다. 12.03.24 55 0
308143 ㅋㅋㅋㅋ 나 앱으로 3달도 안되서 1000만원 범ㅋㅋㅋㅋㅋㅋ [18] 농심오발면(180.68) 12.03.24 375 0
308142 형님들 질문하나 하겠습니다 [1] ㅇㄴㅁ(121.175) 12.03.24 40 0
308141 0 * 음수는? [31] ㅇㅇ(121.189) 12.03.24 146 0
308140 자꾸 질문해서 미안한데 나 너네밖에 없다... [1] (58.75) 12.03.24 62 0
308139 형들 Junit 안된다 ㅠㅠ 알려줘 제발(182.208) 12.03.24 41 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

디시미디어

디시이슈

1/2