gpt4 book ai didi

c++ - 修复 C++ 遗留代码 : class Iterator

转载 作者:行者123 更新时间:2023-11-28 08:14:59 29 4
gpt4 key购买 nike

作为数据结构类作业的一部分,我试图让这个已有十年历史的代码真正起作用。代码可在此处找到:http://www.brpreiss.com/books/opus4/

(这里的所有用户都对这种糟糕的设计感到震惊,振作起来 - 这是一项家庭作业,其目标表面上是让别人的代码工作。我不提倡使用它。 )

在这里,作者定义了 Stack 类及其关联的 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

我不确定这里的目标是什么,因为尝试实例化 StackAsLinkedList::Iter 可以预料地会出错,因为它是私有(private)的。此外,作者在下面的例子中并没有使用刚刚为stack实现的迭代器,而是使用了Stack的父类Container中定义的迭代器来遍历stack并打印值:

StackAsLinkedList stack;
Iter& i = stack.NewIterator();

stack.Push(*new Int(1) ); //type "Int" is a Wrapper for primitive "int"
stack.Push(*new Int(2) );
...

while ( ! outIter.IsDone() )
{
cout << *outIter << endl;
++outIter;
}

...

但是当他创建 stack.NewIterator() 时,查看 Container 中的方法调用显示:

virtual Iterator& NewIterator () const { return *new NullIterator (); }

所以 while 语句中的条件总是会失败,因此主体永远不会执行。

这让我相信我应该为 Stack 实现另一个 NewIterator 方法,但我不确定返回值应该是什么( *new StackAsLinkedList::Iter(_stack) ?)。

有什么想法吗?

最佳答案

在 StackAsLinkedList 中添加以下方法似乎可以解决问题:

Iterator& StackAsLinkedList::NewIterator() const
{
return *new Iter(*this);
}

此外,main() 中的赋值顺序也是一个问题。这似乎更正了它:

StackAsLinkedList stack;

stack.Push(*new Int(1) ); //type "Int" is a Wrapper for primitive "int"
stack.Push(*new Int(2) );
...

Iter& i = stack.NewIterator();

while ( ! outIter.IsDone() )
{
cout << *outIter << endl;
++outIter;
}

我意识到这个解决方案并不理想 - 理想情况下我应该重构或更好但重新开始(或只使用 STL)。但正如我上面所说,目标只是让这些东西在有限的时间范围内编译和工作。因此,为了回应其他人所说的话:请不要使用此代码!

关于c++ - 修复 C++ 遗留代码 : class Iterator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7947205/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com