2011-10-24 3 views
4

여러 클래스의 객체를 포함하는 배열을 만들어야합니다.C++ 다른 클래스의 객체 배열 만들기

class baseClass 
{ 
    // 
}; 

class first : baseClass 
{ 
    // 
}; 

class second : baseClass 
{ 
    // 
}; 

어떻게 first 및/또는 그 안에 second 객체를 저장할 수있는 배열을 만들려면 어떻게해야합니까?

그것은 다소 그래서 배열을 사용하도록 강요하고 나를 위해 집에서 작업이다, 나는 이미 검색과는 부스트 라이브러리 ANS 등으로 수행되는 것을 알고 있지만 여기에는 옵션들 ...이 없다

+0

유사 : http://stackoverflow.com/questions/7018183/provide-array-of-derived-objects-to-function-that-operates-on-base-objects – tinman

답변

2
baseClass *array[10]; 
baseClass **array2 = new baseClass *[size]; 

(delete 모든 것을 잊지 마세요). 누설이나 이중 자유를 피하기 위해 객체의 수명에주의해야합니다. 특히 런타임에 크기를 변경해야하는 경우 배열의 할당 및 할당 해제에주의해야합니다. 벡터가 당신을 위해 배열의 메모리를 처리하기 때문에

std::vector<baseClass*> vec; 

이 앞의 예를 향상,하지만 당신은 여전히 ​​BaseClass로 포인터에주의해야한다.

std::vector<boost::variant<first,second> > vec2; 

수동으로 개체를 할당하거나 할당 해제 메모리 할 필요가 없습니다 또 다른 개선이며, 최초 또는 초와 같은 개체에 액세스 측면에서 안전 입력합니다. 한 종류의 물체를 다른 물체와 착각 할 수는 없습니다.

std::vector<std::unique_ptr<baseClass>> vec3; 
여전히 서로 다른 유형의 객체를 혼동 할 수이 옵션을

하지만 그것은 단지 표준 라이브러리를 사용하고 당신은 여전히 ​​당신이 할당 개체의 수명을 관리 할 필요가 없습니다. 그것은 C++ 11을 사용합니다. 동적 배열을 필요로하지 않는 경우

또한, std::array<...,size>

std::array<std::unique_ptr<baseClass>,10> array3;baseClass *array[10];를 통해 런타임에 절대적으로 제로 공간이나 시간의 오버 헤드를 가지고 있으며, 훨씬 더 안전 할 수 있습니다. (제로 오버 헤드, 괜찮은 구현을 가정 함)

5

기본 연습에서는 Boost 또는 C++ 11 버전 중 하나 인 스마트 포인터 배열을 기본 클래스에 만드는 것이 가장 좋습니다. 포인터 배열을 사용하면 개체에 액세스 할 때 개체를 "조각 내기"위험이 없습니다. 스마트 포인터를 사용하면 메모리 누수의 위험을 줄일 수 있습니다. 이를 기본 클래스 포인터로 만들면 파생 클래스를 안전하게 저장할 수 있습니다.

2

이 같은 포인터의 배열 필요가있는 라이브러리를 사용할 수없는 경우 :

baseClass *array[123]; 
array[0] = new first(); 
array[1] = new second(); 

을 더 슬라이스가 발생하지 않습니다. 이것은 가장 간단하고 가장 위험한 방법입니다