ADT - Итераторы - оператор ++ - PullRequest
1 голос
/ 27 октября 2010

Это не домашний вопрос.Я взял структуры данных в Общественном колледже, и теперь, когда я учусь в университете, я поговорил с преподавателем об этом классе структур данных.Теперь, так как это действительно отличается, и класс, который я взял, переведен, Он дал мне одно из заданий и сказал: «Играй с ним».Мы никогда не делали никаких контейнеров, упаковщиков, шаблонов ... Итак, я немного растерялся, и я пытаюсь в этом разобраться.Я не новичок в списке ссылок, очереди, стеке, круговых массивах, деревьях и т. Д. Мы просто никогда не делали никакой иерархии ADT с объектом, контейнером.

У меня нет книги по иерархии ADT - контейнер, объект. Может кто-нибудь порекомендовать один.не уверен, что посмотреть?просто ADT?

Вот моя проблема.Я пытаюсь завершить этот код, который он дал мне .. Я пытаюсь написать функцию operator ++ () = 0;Я не уверен насчет синтаксиса

#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;
};

#endif

, а вот заголовок контейнера ..

#ifndef CONTAINER_H
#define CONTAINER_H

#include <ostream>
#include "Object.h"
#include "Ownership.h"
#include "Iterator.h"
#include "Visitor.h"

class Container : public virtual Object, public virtual Ownership
{
protected:
unsigned int count;

Container ();
public:
virtual unsigned int Count () const;
virtual bool IsEmpty () const;
virtual bool IsFull () const;
//  virtual HashValue Hash () const;
virtual void Put (ostream&) const;
virtual Iterator& NewIterator () const;

virtual void Purge () = 0;
virtual void Accept (Visitor&) const = 0;
};

#endif

, а вот файл container.cpp, где мне нужна помощь с синтаксисом для ++

#include <iostream>
#include "Container.h"

void Container::Purge()
{

if (IsOwner())

count = 0;

}

Container::Container () :
count (0)
{}

unsigned int Container::Count () const
{ return count; }

bool Container::IsEmpty () const
{ return Count () == 0; }

bool Container::IsFull () const
{ return false; }



Iterator Iterator::operator ++() //syntax wrong..
{

return;

}

Iterator& Container::NewIterator() const
{

return *new Container (*this); 


}

Я также не уверен, сделал ли я виртуальный Iterator & NewIterator () const;право?

Ответы [ 3 ]

2 голосов
/ 27 октября 2010

C ++ имеет концепции итераторов, которые немного отличаются от того, что вы увидите в книге шаблонов или других языках. То, что он имеет эту пустоту возврата op ++, очень не-C ++; Я бы сделал это обычным именованным методом, если бы сохранил эту модель. Однако в этом ваша проблема: у вас есть тип возвращаемого значения Iterator, а в определении класса указано void.

NewIterator бесконечно рекурсивен (по-видимому, быстро исправляется «неправильная вставка»), и тип возвращаемого значения должен быть по значению, а не по ссылке. Этот тип возврата неверен как в заголовке, так и в файле .cpp. Однако здесь происходит нечто иное, потому что Iterator является абстрактным базовым классом; Я полагаю, что вы должны написать свой собственный производный класс:

struct MyIterator : Iterator {
  //...
};

На самом деле, скажем так, Контейнер также абстрактный базовый класс, а не то, что вы должны реализовывать напрямую. (Это означает, что NewIterator либо имеет утечку памяти, либо поддерживает только один итератор на контейнер, поэтому на самом деле это не new iterator ...)

Вам нужно запросить дополнительную информацию. У вас нет достаточно, чтобы помочь нам помочь вам. Я бы порекомендовал Программирование: принципы и практика использования C ++ в качестве общего введения в C ++ для новых программистов, но он охватывает более широкий спектр, чем структуры данных, и может не помочь вам в подготовке к поступлению в университет, которую вы сейчас делаете - похоже, что они пытаются написать Java на C ++ ...

1 голос
/ 27 октября 2010

Я думаю, вы должны взглянуть на итераторы в STL.Это поможет вам в вашей концепции.

В вашем коде оператор ++ объявлен возвращающим void, что неверно.Вы также забыли другую версию operator ++, функции operator- и operator->, которые являются отличными помощниками при использовании итераторов.

В вашем контейнере нет переменной-члена для фактического хранения данных, а NewIterator имеет бесконечную рекурсию вэто.

Вам также не хватает много ссылок.

0 голосов
/ 27 октября 2010

Я вижу одну вероятную проблему с проблемой "синтаксической ошибки".

Ваш оператор ++ объявлен как возвращающий пустоту, которая не соответствует типу возврата в определении.

Непересмотрел код для аспектов дизайна, хотя ...

...