2010-12-26 6 views
0
내 목록에서 개체 (또는 유형) 내가 가진의 유형을 알고 싶어

그래서 내가 쓴 :목록의 개체 유형을 확인하는 방법은 무엇입니까?

void **list; //list of references 
list = new void * [2]; 
Foo foo = Foo(); 
const char *not_table [] = {"tf", "ft", 0 }; 

list[0] = &foo; 
list[1] = not_table; 

if (dynamic_cast<LogicProcessor*>(list[0])) { //ERROR here ;(
    printf("Foo was found\n"); 
} 
if (dynamic_cast<char*> (list[0])) { //ERROR here ;(
printf("char was found\n"); 
} 

하지만 난 얻을 :

error: cannot dynamic_cast '* list' (of type 'void*') to type 'class Foo*' (source is not a pointer to class) 
error: cannot dynamic_cast '* list' (of type 'void*') to type 'char*' (target is not pointer or reference to class) 

는 왜입니까? 내가 여기서 뭘 잘못하고 있니? 여기에 dynamic_cast를 사용해야합니까? 사전에

감사

편집 : 나는 위의 코드를 알고

많은 일반 C처럼 확실하게보기의 C++ 관점에서 짜증하지만 단지 나는 내가 정말 전에 뭔가를 다음과 같은 상황려고 한 것입니다 구현 :

길이가 두 개인 배열이 두 개 있지만 두 인덱스가 같은 인덱스에 개체를 가질 수 없습니다. 따라서, 또는 array1 [i]! = NULL 또는 array2 [i]! = NULL이 있습니다. 이것은 분명히 메모리 낭비이므로 길이 n의 단일 배열에 두 가지 종류의 객체를 모두 가질 수 있다면 모든 것이 해결 될 것이라고 생각했습니다.

Cocoa (Objective-C) NSArray와 같이 객체의 유형을 신경 쓰지 않아도됩니다. 객체의 유형을 알지 못하더라도 다른 메소드를 사용할 수 있으므로 문제가되지 않습니다. 나중에 확실하게 수업을 듣기. C++ (제 3 자 C++ 라이브러리가 아닌 것이 좋음)가 있습니까?

미리 감사드립니다;)

+0

같은 것을 제안 C와 같은 확인하려면? C++은 동적으로 유형이 지정된 언어입니다. 동적으로 형식이 지정된 객체를 사용하여 어떤 기능을 개발하려고합니까? 우리가 이것을 안다면 더 유용한 대답을 제공 할 수 있습니다. –

답변

2

이 목적을 달성하려면 boost :: variant 또는 boost :: any를 사용해야합니다. dynamic_cast는 소스 및 대상 유형이 상속으로 연결될 때만 작동합니다. 또한 void *를 사용하는 것은 절대적으로 안전하지 않기 때문에 압도적 인 대다수의 코드에서 끔찍하고 끔찍한 스타일입니다.

사실, 코드를 읽으면서 C++ 기본 서적을 구할 것을 제안합니다.

EDIT : dynamic_cast는 상속으로 링크 된 유형에만 작동하며 기본 클래스에 가상 함수가 하나 이상 있어야합니다.

+0

이것은 완전히 실험적이었고 무효의 비 안전성을 알고 있습니다. 그러나 무언가를 시도하고 있었는데 지금은 나쁜 생각이었습니다. boost :: variant 및 boost :: any 언급 주셔서 감사합니다. – nacho4d

1

Dynamic_cast는 void 포인터에서 작동하지 않습니다. 대신 목록에 형식화 된 포인터 (예 : 일반적인 기본 클래스에 대한 포인터)를 저장하거나 reinterpret_cast를 사용해야합니다 (변환이 제대로되지 않더라도 reinterpret_cast가 성공할 것이므로 매우주의해야합니다)

당신이 그런 종류의 아무것도하기 전에
1

당신의 코드는 C++에서 끔찍한 것이지만, C에서는 그 일이 아주 일반적입니다 ... 프로그램에서 C++ 기능을 사용하지 않으면 질문 범주를 C로 변경해야합니까?

당신이 그때 당신이 달성하려고하는 무슨

enum type{ type1, type2, typeChar, typeFoo } 

struct ptr{ 
    void * p; 
    type t; 
}; 

ptr* list=new ptr[2]; 
list[0].p = &foo; 
list[0].t = typeFoo; 
list[1].p = not_table; 
list[1].t = typeChar; 

if (list[0].t == typeChar){ 
    printf("char was found\n"); 
} 
if (list[0].t == typeFoo){ 
    printf("Foo was found\n"); 
} 
관련 문제