Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
pihta
1 / 1 / 0
Регистрация: 11.11.2012
Сообщений: 23
#1

Определить функции итератора, вне класса - C++

07.03.2014, 23:00. Просмотров 312. Ответов 3
Метки нет (Все метки)

Есть класс, к примеру очередь Queue, и есть итератор этого класса, объявленный внутри класса, как его public член. Я хочу определить функции итератора, вне класса. Так вот, как это сделать, особенно если мне надо чтобы функция оперировала, к примеру возвращала, класс итератор.

Короче отвратительно объяснил, но вот реализация самого класса(кстати тоже отвратительная, но как мог ) :
1) Queue.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
#include <iostream>
using std::cout;
 
#include "Member.h"
 
template <typename T>
class Queue
{
    public:
        class const_iterator;
 
        Queue();
        ~Queue();
 
        void enqueue( const T& );
        void dequeue( T& );
 
        const_iterator begin(){return const_iterator(firstPtr);};
        const_iterator end(){return const_iterator(NULL);};
 
        bool isEmpty() const;
        int getCount() const;
 
    private:
        Member<T> *firstPtr;
        Member<T> *lastPtr;
 
        int count;
};
 
//////////////////////////////////////// class Queue<T>
 
template <typename T>
Queue<T>::Queue()
:firstPtr(NULL), lastPtr(NULL), count(0)
{
}
 
template <typename T>
Queue<T>::~Queue()
{ 
    if( !isEmpty() )
    {
        Member<T> *currentPtr = firstPtr;
        Member<T> *tempPtr;
 
        while( currentPtr != NULL)
        {
            tempPtr = currentPtr;
            currentPtr = currentPtr->nextPtr;
            delete tempPtr;
        }
    }
}
 
template <typename T>
void Queue<T>::enqueue(const T& value)
{
    Member<T> *newPtr = new Member<T>( value );
 
    if( isEmpty() ) 
        firstPtr = lastPtr = newPtr;
    else
    {
        lastPtr->nextPtr = newPtr;
        lastPtr = newPtr;
    }
 
    count++;
}
 
template< typename T >
void Queue<T>::dequeue( T& temp)
{
    if( !isEmpty() )
    {
        Member<T> *deletePtr = lastPtr;
 
        if( firstPtr == lastPtr)
            firstPtr = lastPtr = NULL;
        else
        {
            Member<T> *currentPtr = firstPtr;
 
            while( currentPtr->nextPtr != lastPtr)
                currentPtr = currentPtr->nextPtr;
 
            lastPtr = currentPtr;
            currentPtr->nextPtr = NULL;
        }
 
        temp = deletePtr->data;
        delete deletePtr;
 
        count--;
    }
}
 
template< typename T >
bool Queue<T>::isEmpty() const
{
    return firstPtr == NULL;
}
 
template <typename T>
int Queue<T>::getCount() const
{
    return count;
}
 
//////////////////////////////////////// class Queue<T>::const_iterator
 
template <typename T>
class Queue<T>::const_iterator
{
    friend class Queue<T>;
 
    public:
        const_iterator();
 
        const T& operator*() const;
        void operator++(int);
 
        //bool operator==() const;
        //bool operator!=() const;
 
    private:
        Member<T> *ptr;
 
        const_iterator(Member<T>*);
};
 
template <typename T>
Queue<T>::const_iterator::const_iterator()
:ptr(NULL)
{ 
}
 
template <typename T>
Queue<T>::const_iterator::const_iterator(Member<T>* pointer)
:ptr(pointer)
{ 
}
 
template <typename T>
const T& Queue<T>::const_iterator::operator*() const
{
    return ptr->data;
}
 
template <typename T>
void Queue<T>::const_iterator::operator++(int)
{
    const_iterator obj(ptr);
 
    if( ptr != NULL)
        ptr = ptr->nextPtr;
}
2) Member.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
template <typename T> class Queue;
 
template <typename T>
class Member
{
    friend class Queue<T>;
    friend class Queue<T>::const_iterator;
 
    public:
        Member( const T&);
        const T& getData() const;
 
    private:
        T data;
        Member<T>* nextPtr;
};
 
template <typename T>
Member<T>::Member(const T &value)
: data(value), nextPtr( NULL )
{
}
 
template <typename T>
const T& Member<T>::getData() const
{
    return data;
}
3)и мэйн, если кому понадобиться
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include "Queue.h"
#include "Member.h"
 
int main()
{
    Queue<int> q;
    Queue<int>::const_iterator it;
 
    for(int i=0; i<30; i++)
        q.enqueue( (i*i*i)/7 + 3*(i-1) );
    
    it = q.begin();
 
    for(int i = 0; i < q.getCount(); i++)
    {
        cout << *it << " ";
        it++;
    }
 
    cin.get();
    return 0;
}
короче, суть вопроса в том, чтобы переопределить оператор++ так, чтобы он возвращал const_iterator. И вообще если есть какие-то критические замечания, то пишете, ибо класс писал сам, как в голову пришло, и наверняка пришло плохо)

Добавлено через 26 минут
Ну не знаю, может, чтобы не так занудно смотрелось, попробую ещё пояснить. Вот функция:
C++
1
2
3
4
5
6
7
8
template <typename T>
void Queue<T>::const_iterator::operator++(int)
{
    const_iterator obj(ptr);
 
    if( ptr != NULL)
        ptr = ptr->nextPtr;
}
И как сделать так, чтобы она возвращала не void, а *this?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.03.2014, 23:00
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Определить функции итератора, вне класса (C++):

Вызов функции вне класса - C++
Есть класс, в нем два метода. В одном из них надо вызвать функцию, которая расположена вне класса. Как зделать?? Можете на примере...

Как определить тип возвращаемого значения шаблонной функции по типу итератора (не auto)? - C++
Здравствуйте. Есть шаблонная функция (например, суммирования). Входные значения два итератора -- начало конец. template &lt;typename...

Функция вне класса для передачи функции объекта - C++
Добрый вечер, уважаемые форумчане. Столкнулся с таким пунктом в условии задания: Создать функцию вне класса для передачи функции...

Проиллюстрируйте работу простейщего класса итератора - C++
Дан класс, представляющий собой векторную таблицу. Как будет выглядеть для него класс итератор. Если можно, покажите, как перебираются...

Класс итератора для класса вектора - C++
Необходимо реализовать собственный класс итератора для прохода по вектору, с перегрузкой оператора ++ - переход к следующему элементу и --...

Ошибка при использовании итератора в реализации класса - C++
На скрине всё понятно чо каво. Собственно, что я упустил? Что не дочитал? Проясните, пожалуйста. Из-за медленного интернета не могу...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
08.03.2014, 00:11 #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
объявления недостаточно. определите класс const_iterator. опишите, какие у него методы:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
template <typename T>
class Queue
{
    public:
        class const_iterator
        {
           public:
             void Method1();
             void Method2();
 
             const_iterator& operator ++ (int); // хотя пост инкремент обычно возвращает объект а не ссылку. вот префиксный - да. ссылку.
 
            private:
              int m_field;
        };
 
     ....
C++
1
2
3
4
5
6
template <typename T>
typename Queue<T>::const_iterator& Queue<T>::const_iterator::operator++(int)
{
  ...
  return *this;
}
pihta
1 / 1 / 0
Регистрация: 11.11.2012
Сообщений: 23
08.03.2014, 00:38  [ТС] #3
Извиняюсь, если не затруднит, то можете ещё пояснить, почему код
C++
1
2
3
4
5
template <typename T>
typename Queue<T>::const_iterator& Queue<T>::const_iterator::operator++()
{
  return *this;
}
работает, а код
C++
1
2
3
4
5
template <typename T>
Queue<T>::const_iterator& Queue<T>::const_iterator::operator++()
{
  return *this;
}
не работает?
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
08.03.2014, 11:21 #4
ищите "зависимые имена типов в шаблонах"
зависимые от типа аргумента шаблона.
вот тут в 42 правиле вроде что-то есть:
http://www.plam.ru/compinet/yeffekti...ogramm/p11.php

если кратно, то имя
Queue<T>::const_iterator
не рассматривается компилятором как имя типа.
это может быть имя функции, имя переменной или хз что еще.
причем это зависит от параметра T.
Могут быть специализации, в которых const_iterator это имя типа,
а могут быть такие, где это скажем переменная.
чтобы явно сказать компилятору, чтобы он считал const_iterator
именем типа, используют ключевое слово typename
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.03.2014, 11:21
Привет! Вот еще темы с ответами:

Ошибка в перегрузке операторов для класса - итератора - C++
Добрый вечер. Есть заготовка программы для работы с матрицей, построенной из узлов с четырьмя связями (вверх, вниз, влево, вправо)....

Возврат итератора из функции - C++
в чем заключается проблема с возвратом итератора и как ее исправить? заранее спасибо за ответ =) (ожидаемый от программы ответ &quot;Yes&quot;,...

Возврат итератора map из шаблонной функции - C++
Собственно, вот: Вызов функции: Find&lt;map&lt;string, Circle*&gt;, map&lt;string, Circle*&gt;::iterator&gt;(CircleMap, CircleIter, st); Сама...

Функция вне класса - C++
Как сделать функцию вне класса? Сделал программу по заданию, но оказалось что функцию *39 строка* нужно было объявить вне класса. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
08.03.2014, 11:21
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru