c++ 소스 작성 중 다형성 관련 에러 질문입니다.
글쓴이: fopenfclose / 작성시간: 수, 2015/12/09 - 12:00오전
미니 게임을 만들고 있는데
말로 설명하는 것보단 .. 굉장히 간단한 게임입니다.
링크:https://youtu.be/AEFQT2Z7t_M
구현하기 위해서 나름 클래스들을 설계해봤습니다.(첨부 파일 참조)
카드 클래스를 상속 받아서
O 타입의 카드 클래스와 X 타입의 카드 클래스를 만들었습니다.
메인 함수에서는 카드에 들어갈 정보에 대한 초기화와 이 초기화된 정보로 25장의 카드를 초기화 합니다.
제가 지금까지 구현한 것은 플레이어 클래스에서 카드를 섞고 섞인 카드를 콘솔에 출력하는 부분입니다.
그런데 카드를 세팅하는 부분에서(나름 다형성을 적용했는데) 런타임 에러가 납니다.
// void CCardGameManager::setCard(CCard ** a_pCard, Card * a_pCardMember) { int i; for (i = 0; i < CARDCOUNT; i++) { if (a_pCardMember[i].cardType == O) { a_pCard[i] = new COCard(); (*a_pCard)[i].setCard(a_pCardMember[i]); <-------------------- 이 부분 입니다. } else { a_pCard[i] = new CXCard(); (*a_pCard)[i].setCard(a_pCardMember[i]); } } }
메인 함수는 <code> int main(int argc, char * argv[]) { // 구조체 Card oCardMember[CARDCOUNT]; Card xCardMember[CARDCOUNT]; // 카드 매니저 클래스 CCardGameManager gameManager; CCard * oCard[CARDCOUNT]; CCard * xCard[CARDCOUNT]; // o 카드 세팅 gameManager.setOcardMemberInit(oCardMember); gameManager.setCard(oCard, oCardMember); // x 카드 세팅 gameManager.setXcardMemberInit(xCardMember); gameManager.setCard(xCard, xCardMember); CPlayer playerOne(oCard); playerOne.cardShuffle(); playerOne.cardShufflePrint(); }
이렇게 되어 있습니다. 메모리 상의 문제인것 같은데
무슨 원인인지 잘 모르겠습니다. 가르쳐주시면 정말 감사하겠습니다. ㅜ
소스와 클래스 다이어그램은 만약을 위해서 첨부해 놓겠습니다.
File attachments:
첨부 | 파일 크기 |
---|---|
TicTacToeProj.zip | 4.33 KB |
2.JPG | 44.3 KB |
Forums:
정리하는데 6시간 걸렸네요.
참고해보세요.
- rand() % 0 을 하게 되면. 오류가 발생합니다.
- char * [숫자]; 를 사용해야. 함수외부에서도 값이 그대로 적용됩니다.
- 변수[범위를 넘는 숫자] = 값; 일 경우. 오류가 발생합니다.
- 변수 초기화를 해주는것이 좋습니다.
- 할당과 해제시 주의해야 합니다.
- 비슷한 문자열은 다른 문자를 사용하시기 바랍니다.
- 함수에 인자값. 리턴값. 오류값을 확인해야 합니다. MSDN 포함.
- NULL 값 처리
- printf() 에 데이터형도 주의하시기 바랍니다.
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
와.... 정말 엄청 감사합니다...
가르쳐주신대로 해보겠습니다.
너무 감사합니다. ㅜ
질문여!!!
작성해주신 소스 중에서
(a_pCard)[i] = new COCard[1] <- 이렇게 객체 배열 생성으로 되어있는데 그냥 new COCard() 하는거랑 차이가 있나요??
참고해보세요.
@.@ 복잡하네요.
new 연산자 초기화 방법 () []
new 생성자
'new operator' 와 'operator new' Programming
http://blog.naver.com/cppis?Redirect=Log&logNo=60036113050
C++ new 연산자의 진실 | ETC
http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=51&MAEULNO=20&no=8364
자바, () 와 new 의 차이점
http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040201&docId=231609869&qb=bmV3ICgpIFtdIOywqOydtA==&enc=utf8§ion=kin&rank=5&search_sort=0&spq=1
new 연산자와 operator new 차이 C++
http://blog.naver.com/cdh8888?Redirect=Log&logNo=220352287127
new 연산자 (C++)
https://msdn.microsoft.com/ko-KR/library/windows/apps/kewsb8ba(v=vs.120).aspx?f=255&MSPPError=-2147217396
[C++] operator new 와 메모리 지정 new(placement new) about 프로그래밍
http://blog.naver.com/mcblagg?Redirect=Log&logNo=10027082656
Placement new( new 연산자 사용시 메모리 지정 하기!! )
http://blog.naver.com/yooncj66?Redirect=Log&logNo=130161721004
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
아 감사합니다. shint 님!!!
아 감사합니다. shint 님!!!
이것도 참고해보세요.
_msize() 는 윈도우에서만 가능하며.
malloc() 으로 메모리를 할당한 경우. 값을 확인하기 좋다.
_msize() 로 클래스를 메모리에 할당하면. 생성자. 소멸자만 있는 경우. 1바이트가 나온다.
멤버 변수가 있으면. 그 크기 만큼 출력 된다.
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
(*a_pCard)[i].setCard(a_pCard
가 아니라
가 아닌가요. a_pCard 변수의 타입이 CCard ** 인데..(타입은 맞지만 잘못된 위치에서 객체로서 참조하고 있습니다.)
(*a_pCard)[i].setCard(a_pCard
좀 더 보기좋게 적으면
그리고 객체지향으로 코딩하시려면, 객체에 대한 Pool도 같이 typedef로 정의하는게 좋습니다.
low level인 배열등은 쓰지 않는게 좋습니다.
이런 식으로 말이죠.
댓글 달기