Stack 클래스의 파생 클래스 인 StackAsLinkedList라는 클래스를 초기화하려고합니다. 여기서 사용할 수있는 테스트 코드는 http://www.brpreiss.com/books/opus4/입니다. 그러나H/W : C++ 오류 "추상 기본 클래스를 초기화하려고합니다"
, 나는 오류가이 코드를 인스턴스화하려고 얻을 주() :
StackAsLinkedList stack;
error C2259: 'StackAsLinkedList' : cannot instantiate abstract class
내가 StackAsLinkedList는 스택의 파생 클래스로 정의된다 생각했기 때문에 나는 이것에 대해 혼란 스러워요 :
#ifndef STACK_H
#define STACK_H
#include "object.h"
#include "linkList.h"
#include "container.h"
class Stack : public virtual Container
{
public:
virtual Object& Top() const = 0;
virtual void Push (Object&) = 0;
virtual Object& Pop() = 0;
};
class StackAsLinkedList : public Stack
{
LinkedList<Object*> list;
class Iter;
public:
StackAsLinkedList() : list() {}
~StackAsLinkedList() { Purge(); }
//
// Push, Pop and Top
//
void Push(Object& object);
Object& Pop();
Object& Top() const;
//
// purge elements from, and accept elements onto, the list
//
void Purge();
void Accept (Visitor&) const;
friend class Iter;
};
class StackAsLinkedList::Iter : public Iterator
{
StackAsLinkedList const& stack;
ListElement<Object*> const* position;
public:
Iter (StackAsLinkedList const& _stack) : stack(_stack) { Reset(); }
//
// determine whether iterator is pointing at null
//
bool IsDone() const { return position == 0; }
//
// overloaded dereference and increment operator
//
Object& operator*() const;
void operator++() const;
void Reset() { position = stack.list.Head(); }
};
#endif
구현 :
#include "stack.h"
void StackAsLinkedList::Purge()
{
if (IsOwner())
{
ListElement<Object*> const* ptr;
for(ptr = list.Head(); ptr != 0; ptr = ptr->Next())
delete ptr->Datum();
list.Purge();
count = 0;
}
}
void StackAsLinkedList::Push(Object& object)
{
list.Prepend(&object);
++count;
}
Object& StackAsLinkedList::Pop()
{
if(count == 0)
throw domain_error ("stack is empty");
Object& result = *list.First();
list.Extract(&result);
--count;
return result;
}
Object& StackAsLinkedList::Top() const
{
if(count == 0)
throw domain_error ("stack is empty");
return *list.First();
}
void StackAsLinkedList::Accept(Visitor& visitor) const
{
ListElement<Object*> const* ptr;
for(ptr = list.Head(); ptr != 0 && !visitor.IsDone(); ptr = ptr->Next())
visitor.Visit(*ptr->Datum());
}
급 컨테이너 :
#ifndef CONTAINER_H
#define CONTAINER_H
#include "object.h"
#include "visitor.h"
#include "iterator.h"
#include "ownership.h"
class Container : public virtual Object, public virtual Ownership
{
protected:
unsigned int count;
Container() : count(0) {}
public:
virtual unsigned int Count() const { return count; }
virtual bool IsEmpty() const { return Count() == 0; }
virtual bool IsFull() const { return false; }
//virtual HashValue Hash() const;
virtual void Put (ostream&) const;
virtual Iterator& NewIterator() const { return *new NullIterator(); }
virtual void Purge() = 0;
virtual void Accept (Visitor&) const = 0;
};
#endif
편집 : 컴파일러에서 Object의 CompareTo() 메서드가 파생 클래스에 구현되어 있지 않은 것으로 보입니다. 그러나,이 기능은 "래퍼"라는 객체의 파생 클래스에서 구현됩니다
#ifndef WRAPPER_H
#define WRAPPER_H
#include "object.h"
template <class T>
class Wrapper : public Object
{
protected:
T datum;
int CompareTo (Object const&) const;
public:
Wrapper();
Wrapper (T const&);
Wrapper& operator = (T const&);
operator T const&() const;
//HashValue Hash() const;
void Put (ostream&) const;
};
//
// typedefs for for Wrappers representing different primitive
// data types
//
typedef Wrapper <int> Int;
typedef Wrapper <char> Char;
typedef Wrapper <double> Double;
typedef Wrapper <std::string> String;
#include "wrapper.inc"
#endif
그러나 스택 래퍼에서 상속하지 않습니다 - 그래서 나는이 다른 compareTo 메소드는 스택 구현 될 필요가 의미 추측 무엇입니까? 원래 저자가 어떻게 작동하는지 (스크래치 헤드) 확실하지 않습니다. 당신은 지금 당신이 그것을 해결하기 위해 노력하고 설명했습니다 때문에
어떤 컴파일러를 사용하고 있습니까? MSVC++ 또는 최신 버전의 gcc를 사용하면'Object & Pop() override;를 쓸 수 있으며 컴파일러는 일치하지 않는지 알려줍니다. 컴파일러가 그 오류와 함께 뱉어 낸 경고도 표시해야합니다. –
컨테이너의 정의를 표시해야합니다. – Puppy
@DeadMG : 당신이 대답을해야한다고 생각합니다. 문제가되는 것이 거의 확실합니다. –