2009-10-19 3 views
0

내 대학의 기본 C++ 강의에이 작업을 수행해야하므로 분명히 알 수 있습니다. 허용 된 경우 STL을 사용했을 것입니다.추상 클래스를 사용하여 파생 클래스의 요소 스택 구현

문제점 : "cube"와 "sphere"클래스에서 파생 된 "shape3d"라는 클래스가 있습니다. 이제 "shape3d_stack"을 구현해야하는데, 이는 "큐브"및 "구"유형의 객체를 보유 할 수 있어야한다는 의미입니다. 이 배열을 사용하고 int 스택을 사용하여 이렇게 할 때 꽤 잘 작동했습니다. 그래서처럼하려고 노력 :

shape3d_stack.cpp :

15 // more stuff 
16  
17  shape3d_stack::shape3d_stack (unsigned size) : 
18   array_ (NULL), 
19   count_ (0), 
20   size_ (size) 
21  { array_ = new shape3d[size]; } 
22  
23 // more stuff 

하지만, 불행하게도, 컴파일러는 나에게 말한다 :

g++ -Wall -O2 -pedantic -I../../UnitTest++/src/ -c shape3d_stack.cpp -o shape3d_stack.o 
shape3d_stack.cpp: In constructor ‘shape3d_stack::shape3d_stack(unsigned int)’: 
shape3d_stack.cpp:21: error: cannot allocate an object of abstract type ‘shape3d’ 
shape3d.hpp:10: note: because the following virtual functions are pure within ‘shape3d’: 
shape3d.hpp:16: note: virtual double shape3d::area() const 
shape3d.hpp:17: note: virtual double shape3d::volume() const 

난이 정말 못생긴 디자인의 일종해야합니다 생각 혼자서 발생한 오류. 그렇다면 "shape3d"에서 파생 된 모든 종류의 객체를 스택에 사용하는 올바른 방법은 무엇입니까?

답변

7

추상 클래스에서 개체를 만들 수 없습니다.
당신은 아마 허용되는 추상 클래스, 포인터의 배열을 만들려면, 파생 인스턴스를 채울 수 있습니다 :

// declaration somewhere: 
shape3d** array_; 

// initalization later: 
array_ = new shape3d*[size]; 

// fill later, triangle is derived from shape3d: 
array_[0] = new triangle; 
3

라인

array_ = new shape3d[size]; 

는 shape3d의 배열을 할당 사물. 큐브가 아니라 구체가 아니라 평범한 오래된 shape3d. 그러나 하나의 shape3d 객체를 추상화하기 때문에 만들 수도 없습니다.

일반적으로 다형성 및 가상 함수를 사용하려면 리터럴 객체가 아닌 포인터 및/또는 참조 인 간접 참조를 사용해야합니다. shape3d *는 큐브 또는 구를 가리킬 수 있지만 shape3d는 항상 shape3d의 하위 클래스가 아닌 shape3d입니다.

0

shape3d은 추상 기본 클래스이므로 실제 객체가 아닌 shape3d에 대한 포인터를 스택에 저장해야 할 수 있습니다.

0

추상 클래스의 새 배열을 만들 수 없습니다. 당신이 할 수있는 것은 포인터의 배열로 선언하고 나중에 어떤 유형의 도형인지 알고 나면 원하는 파생 클래스의 객체를 할당 할 수 있습니다.

0

개체 스택 대신 개체에 대한 포인터 스택을 만들어야합니다.