디시인사이드 갤러리

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

갤러리 본문 영역

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

임사장(210.109) 2012.03.23 18:05:53
조회 77 추천 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 따뜻한 겨울나기! 방한용품 SALE 운영자 25/11/27 - -
308604 횽들아 급질문 ㅠㅠ) HTS(주식거래)프로그램 제작 중인데 힘들어 [12] 트리플악셀갤로그로 이동합니다. 12.03.28 201 0
308603 그누보드가 워드프레스 다 베낀거라는 주장이 사실? [2] KA-1(221.155) 12.03.28 123 0
308602 자바에 이런 기능 있으면 좋겠다.. [4] 아놔콘다갤로그로 이동합니다. 12.03.28 125 0
308600 자바 jsp 학교 과목으로 하는데 환경설정이 앉을떄마다 달라지네여 리리스(210.125) 12.03.28 29 0
308599 255 페이지 중 59 페이지 도달 바보플머(218.155) 12.03.28 32 0
308597 자살플머는 별로지만, 바보춤은 좀 웃겼다 ㅋㅋㅋ [3] 바보플머(218.155) 12.03.28 77 0
308596 영어 교재 하루만에 마스터 하기 도전! 바보플머(218.155) 12.03.28 48 0
308594 대단한 반전이다.... ㅎㄷㄷ [5] 쿄스케갤로그로 이동합니다. 12.03.28 252 0
308592 숙제하기 싫다~ [4] 땡칠도사갤로그로 이동합니다. 12.03.28 83 0
308591 좋은 아침이에요 [2] 어떻해갤로그로 이동합니다. 12.03.28 56 0
308589 횽들 자바 개촙질문 [2] 자바맨(115.20) 12.03.28 47 0
308588 C#, asp.net 교육과정 중에 3개월하고 6개월로 나뉘던데.. insight갤로그로 이동합니다. 12.03.28 68 0
308583 비쥬얼스튜디오 가끔씩 이렇게 중단점 안먹히는거 버그인가요? [2] 모미지갤로그로 이동합니다. 12.03.28 87 0
308582 c 오늘 첨하는데 뭐가 잘못된거임? [2] (124.56) 12.03.28 76 0
308580 씨발 군대생각나서 간짬뽕 존나 빠르게 쳐먹다가 니 코 가 뭐갤로그로 이동합니다. 12.03.28 70 0
308578 야 그럼 이산수학 문제하나 [6] 니 코 가 뭐갤로그로 이동합니다. 12.03.28 122 0
308577 노트북 팔십마넌으면 좋은거사나요 [2] Html갤로그로 이동합니다. 12.03.28 99 0
308576 이산수학 논리와 명제 단원 3분만에 이해하기 [2] ㅇㅁ(114.199) 12.03.28 211 0
308573 아직도 보안에 신경안쓰는 사이트 많더라 [1] 정수정•‿•갤로그로 이동합니다. 12.03.27 173 0
308572 (자살춤 > 삭니)?자살춤:삭니 [2] ㅋㅋㅋ(211.117) 12.03.27 59 0
308571 c 시작한지 4일만에 [7] ㅇㅁ(114.199) 12.03.27 130 0
308570 근데 디씨 왜 이렇게 문제가 많냐? [1] 1(220.76) 12.03.27 53 0
308569 가끔씩 내가 왜 살아야 하는지 모를 때가 많다. SODMaster갤로그로 이동합니다. 12.03.27 49 0
308568 내가 씬입싸원 모나미 인증짤 못보고 입대했는데 [4] ㅋㅋㅋ(211.117) 12.03.27 95 0
308562 막상 회사 들어가니까 언어 생각보다 별거 없더라 [2] ㅇㅇ(210.113) 12.03.27 110 0
308561 자바에서 3%1.2 = ? afd(211.117) 12.03.27 29 0
308559 형들 자바스크립트 계산이 인데요 왜 안될까요 도대체 왜 제발 왜 [4] asd(222.100) 12.03.27 66 0
308558 sql이랑 c랑 합쳐진거 뭐라고 불러? [4] ㅇㅇ(210.113) 12.03.27 80 0
308557 형들아 컴구조 배우다가 멘붕옴 [1] afd(211.117) 12.03.27 75 0
308556 hello world! Html갤로그로 이동합니다. 12.03.27 28 0
308555 주소록 질문좀여 ㅠㅠ lll(203.244) 12.03.27 24 0
308554 열혈강의 C 윤성우저 공부하고 있는데 질문있어요. [2] ㅁㄵㅂ(121.148) 12.03.27 111 0
308553 나눗셈하는데 왜 소수점자리가 0이되버리지?? [1] ㅇㅇㅇ(121.191) 12.03.27 70 0
308552 인간들이 맨날 vim vim 해서 vim을써봤다. [14] ㅇㅇ(112.159) 12.03.27 168 0
308551 프겔의 미래 [5] 시불라미갤로그로 이동합니다. 12.03.27 117 0
308550 IDL 함수 수식쓰는거좀 도와주세요 뭐가잘못된건지; (111.65) 12.03.27 56 0
308549 취미로 웹플밍좀 해볼려고하는데 php+mysql이 젤 무난하냐? [4] ㅇㅇ(112.159) 12.03.27 121 0
308548 닷넷쪽 맛탱이 가고있나보다.. .3(121.143) 12.03.27 79 0
308547 디버깅만 하면 창이 곧바로 꺼지는거 좀 도와주세요.. [5] ㅇㄴ(124.199) 12.03.27 84 0
308546 구글 메인 - less is more [3] sloth_갤로그로 이동합니다. 12.03.27 87 0
308545 레노미아횽 짱 무섭네 [1] 생물학(211.234) 12.03.27 46 0
308543 김유식봐라. ㅇㅇ(112.159) 12.03.27 37 0
308542 드림스파크 시발 한글만 에러남... ㅇㅇ(112.159) 12.03.27 21 0
308540 니들 엿같은 자바랑 안드로이드하지말고, C#이랑 윈폰해라. [1] ㅇㅇ(112.159) 12.03.27 104 0
308539 횽들 api 질문좀.. [1] WKdro(183.100) 12.03.27 49 0
308538 안드로이드(자바).. 이미지파일을 배열로 선언하는 개념을좀..알려주세요 [13] 빵긋(203.226) 12.03.27 131 0
308537 ㅇㅇ 님. [2] 빵긋(203.226) 12.03.27 49 0
308536 안드로이드 이미지 질문... [7] 빵긋(203.226) 12.03.27 74 0
308535 최근 방문갤러리 제대로 뜨네!? ㅋㄱ(183.96) 12.03.27 31 0
308534 형들 자바스크립트 버튼계산기 짜봤는데요 예외처리부분이 어렵네요 갈켜주세요 [2] asdf(222.100) 12.03.27 53 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

디시미디어

디시이슈

1/2