Probeert een klasse genaamd StackAsLinkedList te initialiseren, wat een afgeleide klasse van de abstracte klasse Stack zou moeten zijn (testcode die hier beschikbaar is: http://www.brpreiss.com/books/opus4/ ).
Ik krijg echter een fout bij het proberen om deze code in main() te instantiëren:
StackAsLinkedList stack;
error C2259: 'StackAsLinkedList' : cannot instantiate abstract class
Ik ben hier verward over, omdat ik dacht dat StackAsLinkedList is gedefinieerd als een afgeleide klasse van Stack:
#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
De implementatie:
#include "stack.h"
void StackAsLinkedList::Purge()
{
if ( IsOwner() )
{
ListElement 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 const* ptr;
for(ptr = list.Head(); ptr != 0 && !visitor.IsDone(); ptr = ptr->Next())
visitor.Visit(*ptr->Datum());
}
klasse Container:
#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
EDIT: het lijkt erop dat de compiler zegt dat de methode CompareTo() in Object niet is geïmplementeerd in een van de afgeleide klassen. Deze functionaliteit is echter geïmplementeerd in de afgeleide klasse van Object genaamd "Wrapper":
#ifndef WRAPPER_H
#define WRAPPER_H
#include "object.h"
template
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;
typedef Wrapper Char;
typedef Wrapper Double;
typedef Wrapper String;
#include "wrapper.inc"
#endif
Maar Stack ervaart niet van Wrapper - dus ik vermoed dat dit betekent dat een andere CompareTo-methode moet worden geïmplementeerd voor Stack? Niet zeker hoe de oorspronkelijke auteur dit heeft laten werken (krassende kop).