class CSample; 이것의 의미는 무엇인가요?
글쓴이: bejoy4him / 작성시간: 목, 2005/03/31 - 1:13오후
초보자가 하는 질문이니..
기초도 모른다고 RTFM하지 마시고 간단히 설명을 좀 해주셨으면 좋겠습니다.
VC++6상에서 작성된 어떤 소스를 분석하고 있는 도중
CSample의 헤더파일을 include해주지 않은것 같은데.. 컴파일 에러가 나지 않기에...
파일의 처음을 살펴보니
class CSample;
과 같은 것이 있었습니다. 그 라인이 뜻하는 바가 무엇이죠? class의 인스턴스를 생성한것두 아니구..ㅡㅡ;; 저것 때문에 컴파일 에러가 나지 않은 것인가요? 저것이 namespace와 연관있는 것인지....
또 한가지더 궁금한게 있습니다.
c++에서 함수의 타입이 virtual로 선언될때 virtual이 지니는 의미는 무엇인지 설명을 좀 부탁드립니다.
Forums:
forward declaration 입니다.클래스를 이름만 선언하는거
forward declaration 입니다.
클래스를 이름만 선언하는거죠. 정의는 다른 곳에서 하고..
클래스에 대한 포인터만 만들면 될 경우 클래스의 정의가 필요 없기때문에 불필요한 헤더파일 의존성을 만들지 않기 위해 사용하는 것이죠. 물론 선언만 하고 정의가 안 되어있을 경우 해당 클래스의 인스턴스를 생성하거나 해당 클래스 타입의 멤버를 사용할 수는 없습니다. 오로지 해당 클래스의 포인터와 레퍼런스 타입만을 다룰 수 있지요.
Re: class CSample; 이것의 의미는 무엇인가요?
네, 맞습니다
code 상의 다른 class 에서 CSample 클래스를 사용했을 때
컴파일러한테 CSample 이 뭔지 알려주는겁니다
보통은 CSample 클래스를 선언한 header file 을 include 해야겠지만,
작업하다보면 서로를 include 해야만 하는 상황이 발생하거든요
그럴땐 꼭 필요하죠.
예전에 이게 설계를 잘못한거다 아니다로
논쟁이 있었던 걸로 기억합니다만
쓰고보니 매지님이 설명하신 경우때문에 쓰는 경우가 더 많겠네요
저도 참고하겠습니다.
이건 그냥 설명 드리기도 어렵고
RTFM 정도로도 안되구요
아무 책이나 C++ 이라고 씌여있는 책이라면
반드시 설명을 해두었을겁니다
C++ 의 핵심중에 핵심 내용이니까 완벽히 이해하시길
개념없는 초딩들은 좋은 말로 할때 DC나 웃대가서 놀아라. 응?
답변 달아 주신분들께.. 감사합니다.첫번째 질문에 대한 것은 이해
답변 달아 주신분들께.. 감사합니다.
첫번째 질문에 대한 것은 이해를 하였습니다.
두번째 virtual에 관한 질문은.. 제가 너무 큰 범위로 질문을 해놔서 제대로 답변을 못해주신것 같습니다.
virtual이라는 키워드가 late binding을 지시하는 것으로 알고 있습니다. 그 키워드가 없으면 early binding을 하구요..
그런데 굳이 late binding을 하는 이유가 무엇일까 하는 것입니다. earlybinding을 하더라도 상속받은 클래스에서 재정의 하면 되는데.. 굳이 late binding을 하는 이유는 무엇일까 하는 것이죠..
단순히 over head를 줄이기 위함인가요? 아니면 제가 모르는 다른점이 있어서 인가요?
맨날 C만 다루다 보니 클래스에 대한 개념이 많이 부족하네요..
좋은 답변 부탁드립니다.
그것은..
스타크래프트 하시죠?
marine과 tank를
마우스 네모로 만들어서,
선택하면 같이 선택 되죠?
Cmarine 과 Ctank가 서로 다른 클래스인데
어떻게 같이 선택되는 것을 구현할까요?
또, 마우스로 땅을 클릭하면
탱크와 마린이 함께 그쪽으로 옮겨가죠.
두개가 모두 Cterran의 후손 들이라면,
Cterran 의 포인터로 탱크, 마린을 공통적으로 접근 할수 있습니다.
그게 virtual과 late binding 을 쓰는 이유입니다.
이해 되시나요?
게임프로그램자체로는 사용자가 뭘 선택할지 모릅니다.
[quote="bejoy4him"]답변 달아 주신분들께.. 감사합니다.
자식 클래스에서 부모에 있는 것과 같은 함수를 다시 정의하는 것을 재정의라고 하는데, virtual 키워드를 붙인 함수는 자식 클래스를 부모형으로 받은 다음 해당 함수를 불러도 제대로 재정의된 함수를 불러줍니다. virtual이 없으면 그렇게 안되구요.
----------------------------
May the F/OSS be with you..
참고로 virtual 함수가 있는 클래스의크기를 sizeof로 확인해
참고로 virtual 함수가 있는 클래스의
크기를 sizeof로 확인해 보세요. 있을때랑 없을때랑
일반적인 32비트 컴파일환경에서 4바이트 가량 차이 납니다.
vtable을 가리키는 vptr이 차지하고 있답니다. :D
[quote]virtual 키워드를 붙인 함수는 자식 클래스를 부모형으로
그러니까.. 부모클래스 타입의 포인터로 자식 클래스를 가르키고 있을때.. 자식 클래스에서 재정의된 함수를 호출하려 할때... 자식 클래스 타입으로 형변환 하지 않아도 된다는 말씀이시죠.. ^^
오호.. 그런 점이 있었다니...
스타를 예를 들어주신 분을 포함하여... ^^, vtable에 관련해 말씀해 주신것두 고맙구요..
다들 감사합니다. 좋은 하루 되시길....
그런데 쓰고 보니 무슨 작별인사 같네요.. ㅡㅡ;;
댓글 달기