2009-10-16 2 views

답변

5

C++는 C가 더 많은 항목입니다. 그래서 위와 같이 C 방법을 원할 경우 void 포인터 배열을 만듭니다.

 
void *ary[10]; 
ary[0] = new int(); 
ary[1] = new float(); 

DA.

개체 지향적 인 방식으로 작업하려는 경우 컬렉션을 사용하고 컬렉션에 추가 할 모든 기본 사항을 컬렉션에 추가 할 수있는 동일한 기본 개체 클래스에서 파생 시키십시오. . 이것은 java에서 "Object"입니다. C++에는 기본 객체가 내장되어 있지 않지만 사용하는 모든 수집 라이브러리에는 하위 클래스를 만들 수있는 기능이 있습니다.

+0

당신이 보여준 점을 감안할 때, 세상에서 포인터가 실제로 가리키는 유형을 어떻게 알 수 있습니까? – sbi

+0

글쎄, 첫째로, 그건 질문이 아니었지만 대답하는 데는 모든 종류의 방법이 있습니다. 1) 인코딩 된 유형의 병렬 배열을 사용할 수 있습니다. 2) 당신이 거기에 넣을 수있는 모든 다른 종류의 것들을 가진 배열과 변수 타입의 배열 요소 구조를 만들 수 있습니다. 내 머리 꼭대기에 2 개가 있습니다. 나는 다른 누군가가 더 매끄러운 대안을 생각해 낼 수있을 것이라고 확신한다. – stu

+0

@sbi : RTTI를 사용할 수도 있습니다. – kriss

4

와 이 ..., 그것은 ;-)

+0

예를 들어주지 않을 수 있습니까?)) – SomeUser

+10

잠재적으로 폭발적인 상황이 발생할 수 있습니다! – CookieOfFortune

+2

char * c_string = "Hello World"; MyCPlusPlusClass * obj = new MyCPlusPlusClass(); void * SomeArray [] = {c_string, obj}; 물론, 무엇이 무엇인지를 기억하는 방법이 있으면 더 좋을 것입니다. :-) – asveikau

15

일반적으로 쉽게, 당신은 방법으로 그것을 구현 여기서 그것들은 기본 클래스/인터페이스를 파생시키고 그베이스에 대한 포인터를 저장합니다. 그런 다음 다형성을 통해 서로 다른 유형의 동작을 수행 할 수 있습니다.

class Base 
{ 
public: 
    virtual void doSomething() = 0; 
}; 

class A : public Base 
{ 
    void doSomething() { cout << "A\n"; } 
}; 

class B : public Base 
{ 
    void doSomething() { cout << "B\n"; } 
}; 

std::vector<Base*> pointers; 
pointers.push_back(new A); 
pointers.push_back(new B); 
+0

나는이 대답을 좋아한다. 나는 또한 dynamic_cast를 사용하여 어떤 유형이 동적인지 쿼리 할 수 ​​있다고 덧붙였다. 그러나 일부는 그것이 나쁜 것이라고 주장 할 것이다. :-) – asveikau

+0

@asveikau :'dynamic_cast'는 기본적으로 타입을 넘는'switch'입니다. 유형을 전환하면 다형성에 대한 (비합리적 인) 공포의 신호 일뿐입니다. 유혹을받을 때 가상 함수를 대신 사용하십시오. – sbi

+0

dynamic_cast를 나쁜 것으로 생각합니다 :-) – stu

1

예; 배열에서 포인터를 참조하려는 유형으로 캐스팅하십시오.

다른 방법으로 배열의 유니온 요소를 다른 포인터 유형으로 만들 수 있습니다.

8

void에 대한 포인터 배열은 이미 언급되었습니다. 실용적이고 유용하게 사용하려면 boost::any의 배열 (또는 더 나은 벡터)을 사용하는 것이 좋습니다.

3

예. 두 가지 방법 :

• 기본 유형에서 파생 된 유형의 객체를 가리키는 기본 클래스 유형에 대한 포인터.
• 유형이 지정되지 않은 void * 포인터는 포인터를 가리키는 실제 오브젝트 유형으로 수동 변환해야합니다.

첫 번째 방법은 표준 객체 지향 프로그래밍입니다.

두 번째 방법은 저수준 프로그래밍 (예 : 장치 드라이버, 메모리 관리 라이브러리 등)에 유용하며 자신이하는 일을 정확히 알고있는 프로그래머에게만 위험하고 적합하다고 간주됩니다. 분명히 각 포인터의 실제 유형이 무엇인지 알려주는 부가적인 부기 정보가 필요합니다.

0
#include <stdio.h> 

int main(void) 
{ 
    void * ptr[2]; 
    int *a; 
    int b; 

    ptr[0] = "[0] = \"This is a string & c does it better\", [1] = "; 
    *a = 2; 
    ptr[1] = a; 
    b = *((int *) ptr[1]); 
    printf("%s", (char *) ptr[0]); 
    printf("%i\n", b); 

    return 0; 
} 
관련 문제