C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[5996] Re:[질문] 서로 다른 타입의 구조체를 리스트에 넣으려면?
박지훈.임프 [cbuilder] 2747 읽음    2001-03-10 01:42
쌈개 님이 쓰신 글 :
: 안녕하세요 임프님!!
: 환절기 감기 조심하시구요.. ^^
:
: 참으로 머리아픈 문제가 생겼네요..
: 예를 들어... 구조체 A, B, C 가 있습니다.
:
: 이걸 리스트로 관리하려고 하는데 현재는 void*로 처리하는데 문제가 바로 형 변환입니다.
: 즉 리스트에 A, B, C 를 삽입하려면
:
: void *data;
:
: if ( type == 0 )
:      data = new A;
: else if ( type == 1)
:      data = new B;
: else if ( type == 2)
:      data = new C;
:
: list->Add(data);
:
: 이렇게 했습니다.
: 그런데 이 거에 접근하려면 더욱 더 문제가 되네요. 타입을 알아야 멤버를 쓰니까요.
: 전 TypeList라고 int로 된 리스트를 하나 더 만들었습니다. 아래와 같이요
:
: kind = *((int*)TypeList->Items[i]);
:
: if ( kind == 0 )
:       (A*)list->Items[i]
: else if ( kind == 1 )
:       (B*)list->Items[i]
: .
: .
: .
:
:
: 게다가 문제는 저 구조체 종류가 40-50개를 넘는다는 거죠. 헐...
: 이렇게 되면 소스가 장난아니군요.. -_-;
: 글구 각 구조체들은 일부를 공유하긴 하지만 전혀 비슷한 구석도 없습니다. -_-
:
: 어떻게 해결책이 없을까요?
: C++초보구요. 부탁드립니다.


임펠리테리입니다.

말씀하신대로입니다. 곤란하실 수밖에 없는 것이, 표준 C/C++ 하에서는 그러한 문제에 대한 해결책이 없습니다. 일반적인 C/C++에서는 일단 다른 타입에 대한 포인터로 캐스팅이 되고 나면 그 포인터가 가리키고 있는 곳의 데이터가 원래 무슨 타입인지를 알아낼 방법이 없습니다. 이러한 문제 때문에 C++Builder에서는 RTTI(Runtime Type Identification)라고 하는 새로운 개념을 도입했습니다.

이 RTTI는, 말 그대로, 실행중에 타입을 알아낸다는 뜻입니다. 이 개념의 목적은 포인터가 가리키는 곳의 주소만으로도 그 데이터가 무슨 타입인지를 알아내기 위한 것입니다. 이 개념을 지원하기 위해, VCL의 모든 클래스 객체는 스스로의 타입을 알아낼 수 있는 공통의 멤버함수를 가지고 있습니다. 이 함수들은 TObject에서 가상함수로 선언되어 있으므로, VCL의 모든 클래스들은 스스로가 어떤 상속 단계를 거치는지 그 모든 단계의 클래스 이름을 다 알아낼 수 있습니다. (가상함수는 가장 최하위에서부터 최상위 베이스 클래스의 함수까지 순환적으로 호출이 가능하기 때문)

이 RTTI라는 것은 개념일 뿐이고, 실제로 RTTI의 타입 인식 기능을 이용하려면, C++Builder에서 새롭게 추가된 dynamic_cast 키워드를 사용하면 됩니다. 이 dynamic_cast 키워드를 이용하면 특정 포인터가 어떤 타입으로 캐스팅될 수 있는지, 즉 그 타입에서부터 상속받았거나 그 타입 자체인지를 검사할 수 있습니다.

질문하신 코드를 보면, 이 RTTI의 개념에 너무나 잘 맞는 예이군요. 그런데, 한가지 주의할 점은 있습니다. TList가 가지는 아이템들은 TObject * 형이 아니라 void * 형이므로 일단 TObject * 로 한번 강제 캐스팅을 한 다음 다시 dynamic_cast로 검사를 해주어야 한다는 것입니다. 그리고 리스트에 넣어주는 각 데이터의 타입들을 정의하실 때 반드시 TObject를 상속받도록 하는 것도 잊지 마시구요.

그럼 참고하시길...

+ -

관련 글 리스트
5990 [질문] 서로 다른 타입의 구조체를 리스트에 넣으려면? 쌈개 2332 2001/03/09
6007     Re:[질문] 서로 다른 타입의 구조체를 리스트에 넣으려면? 이영수` 2401 2001/03/10
5996     Re:[질문] 서로 다른 타입의 구조체를 리스트에 넣으려면? 박지훈.임프 2747 2001/03/10
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.