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

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

Восстановить пароль Регистрация
 
pihta
1 / 1 / 0
Регистрация: 11.11.2012
Сообщений: 23
07.03.2014, 23:00     Определить функции итератора, вне класса #1
Есть класс, к примеру очередь 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)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1477 / 1053 / 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
1477 / 1053 / 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
Yandex
Объявления
08.03.2014, 11:21     Определить функции итератора, вне класса
Ответ Создать тему
Опции темы

Текущее время: 06:21. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru