디시인사이드 갤러리

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

갤러리 본문 영역

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

임사장(210.109) 2012.03.23 18:05:53
조회 73 추천 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 - -
공지 프로그래밍 갤러리 이용 안내 [97] 운영자 20.09.28 48753 65
2904434 Arduino Due CP/M Personal Computer 발명도둑잡기(118.216) 09:09 7 0
2904433 난 자바를 좋아하는데 [2] 슈퍼막코더(126.179) 09:02 18 0
2904431 중국 놈들이 여론조작하는 거 밝혀짐 프갤러(118.235) 08:42 548 4
2904429 기술적인 얘기인척 하려해도 늘 같은 소리인거 같음 [3] ㅇㅇ갤로그로 이동합니다. 08:14 37 2
2904427 모바일 SDK 개발하는 팀은 어떤일해? 프갤러(220.92) 07:37 12 0
2904426 cyber security능 끝물이공 버려진field잉 무토깽(218.149) 07:24 17 0
2904425 러스트는 GUI부터 제대로 제공해야 됨 [1] ㅇㅇ(114.30) 06:48 31 0
2904422 요즘은 관리잘하면 50초중까지는 꼴리는듯 ㅇㅇ(118.235) 06:25 28 0
2904421 인지과학조져라 손발이시립디다갤로그로 이동합니다. 06:13 29 0
2904420 발명도둑잡기 차단이 왜 풀려있냐? ㅇㅇ(114.30) 06:11 20 0
2904418 중국인 댓글부대 한국여론조작 포착 [1] ♥냥덩이의우웅한하룽♥갤로그로 이동합니다. 06:07 30 0
2904415 kqueue와 epoll의 시스템 아키텍처 및 설계 철학 비교 나르시갤로그로 이동합니다. 05:46 24 0
2904410 33살 중소3년차 똥통인생 이스펙으로 중견입사 가능하냐..? ㅇㅇ(118.235) 04:59 39 0
2904408 지잡대 졸업 30살인데 학벌 세탁원하는데 학사편입vs대학원 ㅇㅇ(203.232) 04:30 21 0
2904407 Claude cli 오늘 첨 써봤는데 개발자 왜 필요하냐 프갤러(101.235) 04:26 31 0
2904389 Clair.IO.Poller: 이번에 설계했다가 gg친 API ㅋㅋ [1] 나르시갤로그로 이동합니다. 02:59 40 0
2904375 진짜 프로그래머들 ㅈㄴ부럽다 [3] ㅅ스맨갤로그로 이동합니다. 02:18 99 0
2904367 코딩 걍 첨부터 막히는데 어캄 [2] ㅅ스맨갤로그로 이동합니다. 01:54 68 0
2904364 자바 언어 좋지.. 추억과 낭만이 깃들인 언어 ㅋㅋ [3] 나르시갤로그로 이동합니다. 01:45 58 0
2904363 거래소 api들 잘 다루고 싶으면 뭐 부터 배우면 될까요 선배님들 [4] 프갤러(114.204) 01:43 49 0
2904359 0x [1] 루도그담당(58.233) 01:22 37 0
2904358 접시 ㅇㅅㅇ [6] 헤르 미온느갤로그로 이동합니다. 01:12 68 0
2904357 태연 ㅇㅅㅇ 헤르 미온느갤로그로 이동합니다. 01:09 26 0
2904356 하루 한 번 헤르미온느 찬양 헤르 미온느갤로그로 이동합니다. 01:08 45 0
2904324 오픈소스 프로젝트를 하나 해볼까 [12] 에이도비갤로그로 이동합니다. 00:02 105 0
2904320 고 언어 음 좋지 나쁘지 않고 효율적이고 음 근데 [6] 프갤러(110.8) 11.23 68 0
2904316 www.basic4mcu.com 11월까지 서비스 종료 발명도둑잡기(118.216) 11.23 21 0
2904313 카리나가 맛집이넹 ♥냥덩이의우웅한하룽♥갤로그로 이동합니다. 11.23 81 0
2904309 그러고 보니 프갤에서 고랭 팬은 못본거 같은데 [5] chironpractor갤로그로 이동합니다. 11.23 57 0
2904303 클라우드 엔지니어 희망하는데 [2] 프갤러(118.235) 11.23 45 0
2904298 cursor 대체할만한거 있어? [2] ㅇㅇ(124.48) 11.23 53 0
2904295 개발만한 취미가 없는 것 같음 프갤러(61.73) 11.23 65 0
2904294 살면서 잘 한 일... 후배한테 노트북 키스킨 딱 맞는 카라스스킨 5천원 넥도리아(220.74) 11.23 20 0
2904291 에구궁.. 나님 일욜밤까지 모임하구와서 배불러양 [2] ♥냥덩이의우웅한하룽♥갤로그로 이동합니다. 11.23 66 0
2904289 웹디자인은 이미 AI때문에 망한듯 [1] 프갤러(220.70) 11.23 52 0
2904285 왜 극좌들은 하나같이 왕따 당하는걸까? [4] ♥냥덩이의우웅한하룽♥갤로그로 이동합니다. 11.23 51 0
2904266 인공지능 댓글 검사기 발명도둑잡기(118.216) 11.23 30 0
2904265 배달기사 레전드네 진짜; [7] 루도그담당(58.233) 11.23 82 0
2904264 [긴급속보] 한국 연구진이 노벨상 근거를 뒤집자 현재 난리난 천문학계 발명도둑잡기(118.216) 11.23 32 0
2904262 왕따재명 안쓰럽네 ㅠ ㅅ ㅠ [2] ♥냥덩이의우웅한하룽♥갤로그로 이동합니다. 11.23 52 1
2904261 소프트웨어 이름으로 이렁 거 어때? [4] 나르시갤로그로 이동합니다. 11.23 60 0
2904259 긴sql도 셸스크립트도 보기 싫은데 [10] 슈퍼막코더(116.64) 11.23 72 0
2904256 이거 이직 중인데 두개중 어디가야하노 [2] 프갤러(58.231) 11.23 46 0
2904255 베린이평가좀 [1] ㅇㅇ(39.7) 11.23 58 0
2904247 간철수도 어셈블리어한다는데 [2] 타이밍뒷.통수한방(1.213) 11.23 71 0
2904245 국비조언좀요 [2] 프갤러(220.86) 11.23 65 0
2904244 어셈 짜는 중인데 헷갈린다 이기 [12] 루도그담당(58.233) 11.23 98 0
2904243 폴리글랏 툴체인이 나오면 프갤에 평화가 오려나? [10] chironpractor갤로그로 이동합니다. 11.23 71 0
2904242 베이스 ㅍㅌㅊ? ㅇㅇ(203.232) 11.23 55 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

디시미디어

디시이슈

1/2