作为数据结构类赋值的要求,我必须使以下类层次结构起作用:http://www.brpreiss.com/books/opus4/
还提供了源代码,现在我只想尝试编译。这需要将类定义重新组织到各自的头文件中,将模板实现移动到.inc文件中,并完成未实现的代码。我一直在取得进展,但我坚持以下错误(用VC ++编译):
1>main.obj : error LNK2019: unresolved external symbol "public: virtual __thiscall Iterator::~Iterator(void)" (??1Iterator@@UAE@XZ) referenced in function "public: virtual __thiscall NullIterator::~NullIterator(void)" (??1NullIterator@@UAE@XZ)
我已经尝试了所有常用的解决方案(消除冗余的包含语句,清理项目和重新编译等),并且不确定去哪里。如前所述,这里的共识似乎是这个代码库设计得很差。尽管如此,这项任务的要求是让这些代码正常工作,而且我已经深入将它们全部废弃并从头开始。如果它
这是iterator.h中的迭代器类定义
#ifndef ITERATOR_H
#define ITERATOR_H
#include "object.h"
class Iterator
{
public:
virtual ~Iterator ();
virtual void Reset () = 0;
virtual bool IsDone () const = 0;
virtual Object& operator * () const = 0;
virtual void operator ++ () = 0;
};
class NullIterator : public Iterator
{
public:
NullIterator () {}
void Reset () {}
bool IsDone () const { return true; }
Object& operator * () const { return NullObject::Instance(); }
void operator ++ () {}
};
#endif
这些是与迭代器关联的所有其他头文件:
#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
Stack和Queue也继承自Container,但似乎只有堆栈使用Iterator:
#ifndef STACK_H
#define STACK_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() override;
Object& Top() const override;
int CompareTo(Object const& obj) 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++();
void Reset() { position = stack.list.Head(); }
};
#endif
如果有人有一些见解,我们将不胜感激。我一直试图在过去几个小时内解决这个错误,但没有取得任何进展!
答案 0 :(得分:1)
错误是一个链接错误,它告诉您没有提供析构函数的定义:
virtual ~Iterator();
通过以下方式调用:
NullIterator::~NullIterator(void)
因为NullIterator
派生自Iterator
类。
解决方案是您应该提供Base类析构函数的定义。