2009-08-10 8 views
3

클래스 유형이 "xx"인 stl 벡터가 있다고 가정 해 보겠습니다. xx는 추상적입니다. 내가 복사 생성자를 호출해야하기 때문에이 가정stl vector.push_back() 추상 클래스가 컴파일되지 않음

std::vector<xx> victor; 
void pusher(xx& thing) 
{ 
    victor.push_back(thing); 
} 

void main() 
{ 
    ; 
} 

: 나는 컴파일러가 나는 다음과 같이 뭔가를 할 때 내가 "인스턴스화"못하게 문제로 실행했다. xx *를 xx 대신 벡터에 저장하여이 문제를 해결했습니다. 더 나은 해결책이 있습니까? 이게 뭐야?

답변

12

push_back을 사용하면 개체 복사본을 만들어 벡터에 저장합니다. 추측 하듯이 기본적으로 복사 작업이 수행하는 추상 클래스를 인스턴스화 할 수 없으므로이 방법은 작동하지 않습니다.

포인터를 사용하거나 boostloki과 같은 라이브러리에서 사용할 수있는 많은 스마트 포인터 유형 중 하나를 사용하는 것이 좋습니다.

+7

그러나 std :: auto_ptr을 사용하지 마십시오. 이상한 복사 의미 때문에 STL 컨테이너에 넣을 수 없습니다. –

+5

부스트의 ptr_vector - http://www.boost.org/doc/libs/1_39_0/libs/ptr_container/doc/ptr_container.html – bdonlan

+1

을 사용하면 stl 벡터를 사용할 때 기본적으로 xx 상태가 복사됩니다. 그리고 나서 그것을 검색 할 때, C++은 먼저 xx를 인스턴스화하고 적절한 속성으로 채 웁니다. 단순히 오래된 객체를 가리키는 것과는 대조적입니다. 그래서 전체 문제는 우리가 xx의 생성자를 사용하는 것입니까? – Ori

0

std :: vector (및 전체 STL)는 값을 저장하도록 설계되었습니다. 추상 클래스가있는 경우이 유형의 값을 조작하지 않고 포인터 나 포인터를 조작하려고합니다. 그래서 추상 클래스의 std :: vector는 이해가되지 않습니다. 그리고 추상적이 아니더라도, 기본 클래스가되도록 고안된 클래스를 값으로 조작하는 것은 일반적으로 의미가 없으며, 일반적으로 복사 할 수 없도록해야합니다 (복사 생성자와 할당 연산자가 private로 선언되고 구현되지 않은 것은 표준 트릭이며, 예를 들어 boost :: noncopyable -의 후손이 복사 불가능하게 만드는 유일한 목적을 가진 적합한 클래스는 fashionanle이되었습니다.

2

Pope (또는이 경우 Steve Guidi)보다 더 천주교가되기 위해서는 STL 컨테이너에 저장된 개체에 대한 요구 사항은 복사 생성 가능하고 할당 가능하며 추상 클래스도 아닙니다. 따라서이 경우에는 포인터 컨테이너가 필요합니다. 클래스 추상화를하지 않음으로써 문제를 해결하기로 결정한 경우 고려해야 할 또 다른 사항은 slicing입니다.