2009-08-18 5 views
3

개체 (클래스)를 가리키는 포인터 배열을 얻으려면 어떻게해야합니까?포인터 배열

동적으로 공간을 할당해야하며 배열 길이는 런타임까지 결정되지 않습니다. 아무도 그것을 설명하는 법을 설명하고 말해 줄 수 있습니까? 아마도 그것이 어떻게 작동하는지 설명해 줄 수 있습니다.

+0

단일 부모 또는 특정 클래스에서 파생 된 특정 클래스의 포인터? –

+0

아니요 아니요, 모든 클래스 – akif

+0

가변 길이 배열 (VLA)은 비표준 컴파일러 확장입니다. C99 스펙에 추가되었으므로 C++ 스펙에 추가되지 않습니다. intel/gnu/microsoft가 구현 한 컴파일러 확장으로 인해 작동합니다. 벡터 만 사용하면됩니다. –

답변

10

클래스 포인터를 가리키는 포인터로이 작업을 수행 할 수 있습니다.

MyClass ** arrayOfMyClass = new MyClass*[arrayLengthAtRuntime]; 
for (int i=0;i<arrayLengthAtRuntime;++i) 
    arrayOfMyClass[i] = new MyClass(); // Create the MyClass here. 

// ... 
arrayOfMyClass[5]->DoSomething(); // Call a method on your 6th element 

기본적으로 메모리에있는 참조 배열에 대한 포인터를 만듭니다. 최초의 새로운 배열이이 배열을 할당합니다. 루프는 각 MyClass 인스턴스를 해당 배열에 할당합니다.

std :: vector 또는 다른 컨테이너를 사용하면 훨씬 쉽게 될 수 있지만, 위와 같은 경우에는 메모리를 직접 관리해야합니다.

+1

내가 틀렸다면 (그 동안은) 나를 정정하십시오. 그러나 끝나면 delete []를 호출하여 놓아주십시오. –

+0

배열의 수명이 단일 함수 호출보다 길다고 가정 할 때 삭제할 코드를 표시했다고 생각하지 않습니다. 또한 크기를 조정하는 것은 힘들 수 있습니다. 따라서 벡터/목록 컬렉션 클래스에 대한 제안. – Kieveli

+0

벡터를 사용하면 delete를 호출해야합니까?동적으로 메모리를 할당합니다. – akif

15

대신 std::vector을 사용하십시오. 필요에 따라 컬렉션의 크기를 동적으로 조정하도록 설계되었습니다.

#include <vector> 
// ... 
std::vector<Class*> vec; 
vec.push_back(my_class_ptr); 
Class* ptr = vec[0]; 
+0

고마워요, 나는 그것에 대해서도 살펴볼 것입니다 – akif

+2

벡터에 STL 알고리즘을 사용하면 포인터의 벡터가 여전히 누출 될 가능성이 많습니다. 가능한 경우 포인터 대신 오브젝트 벡터를 사용하십시오. – KJAWolf

+1

@KJAWolf :'std :: vector '으로 누출을 일으키는 STL 알고리즘의 몇 가지 예를 들려 줄 수 있습니까? –

3

편집하거나 댓글을 달 수 없으므로 답변에 게시해야합니다. Reed Copsey가 말했지만 수정본이 하나 있습니다. 당신은 포인터의 배열의 요소에 액세스 할 때이 같은 멤버에 액세스해야합니다

MyClass ** arrayOfMyClass = new MyClass*[arrayLengthAtRuntime]; 
for (int i=0;i<arrayLengthAtRuntime;++i) 
    arrayOfMyClass[i] = new MyClass(); // Create the MyClass here. 

// ... 
arrayOfMyClass[5]->DoSomething(); // Call a method on your 6th element 

내가 (: 벡터가 무엇인지 표준) 내 자신의 동적 크기 배열을 구현하기 위해이 방법을 많이 사용, 주로 I 때문에 나는이 증후군을 발명하지 않았지만, 내가 그들을 나의 특별한 용도로 커스터마이즈하기를 좋아하기 때문에.

+1

'std :: vector'에 대한 증후군을 발명하지 않았습니까? : O 그렇다면 실제로 C++ 컴파일러 작성을 고려해야합니다. 아마도 자신의 CPU를 빌드하십시오. –

+0

글쎄, 부분적으로는 std :: vector의 존재에 대해 알기 전에 내 자신의 벡터를 작성하는 법을 배웠기 때문에 부분적으로는 습관 일뿐입니다.) –

4

사용 boost::ptr_vector 잊지 모두 배열 및 포인터 두통 :

boost::ptr_vector<animal> vec; 
vec.push_back(new animal); 
vec[0].eat(); 

동적 요소를 추가 할 수 있으며이를 삭제에 대해 걱정할 필요가 없습니다.

+0

부스트가 옵션이 아니면 (슬프게도, 이것은 어디서나 볼 수 있습니다. 일부 무모한 이유로 C++ 코드에서 작동합니다.)하지만 TR1은 - 예를 들어 당신은 최근 g ++ 버전, 또는 VC++ 2008 SP1을 사용하고 있습니다. 그리고'std :: vector >'도 트릭을 할 것입니다. –