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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ При запуске проверить, установлен ли фреймворк http://www.cyberforum.ru/cpp-beginners/thread1113726.html
люди,помогите,пишу на платоформе НЕТ,посоветуйте какойто код что поможет сделать следующее: прога при запуске проверяет установлен ли фрамеворк,если да то запускает основную программу если нет то...
C++ Движение шарика по законам геометрической оптики Нужна помощь форумучан. Суть в заголовке. Нужно сделать что бы шарик отскакивал от стенок по закона геометрической оптики. Появится этот шар должен по щелчку мыши. Буду благодарен за помощь . ... http://www.cyberforum.ru/cpp-beginners/thread1113724.html
C++ Определить, можно ли заполнить бочку используя ведра только один раз
Дана бочка, ёмкостью b и N штук разного объёма V вёдер. МОжно ли заполнить бочку используя ведра только один раз
Создать два новых массива, в один из которых поместить положительные элементы массива, а в другой отрицательные и нулевые элементы C++
Написать программу , которая вводит с клавиатуры массив из N вещественных чисел , создает два новых массива , в один из которых помещает положительные элементы массива , а в другой отрицательные и...
C++ Посчитать всевозможные суммы http://www.cyberforum.ru/cpp-beginners/thread1113670.html
Дан массив из n элементов, надо посчитать всевозможные суммы и сравнить их с числом B; Под всвозможными суммами я имею в виду выделить сначала первый элемент и сложить его со всеми , потом первыйй...
C++ Поиск одинаковых слов в тексте Решить на С++ с комментариями, если не сложно! :) Дан файл, содержащий текст на русском языке. Найти слова, встречающиеся в каждом предложении, или сообщить, что таких слов нет. подробнее

Показать сообщение отдельно
pihta
1 / 1 / 0
Регистрация: 11.11.2012
Сообщений: 23

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

07.03.2014, 23:00. Просмотров 315. Ответов 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?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru