Форум программистов, компьютерный форум 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 вещественных чисел , создает два новых массива , в один из которых помещает положительные элементы массива , а в другой отрицательные и нулевые элементы,и выводит результат пользователю ; затем вводит с клавиатуры строку длиной не более 200 символов , ищет в ней самое короткое слово и выводит его пользователю
C++ Посчитать всевозможные суммы http://www.cyberforum.ru/cpp-beginners/thread1113670.html
Дан массив из n элементов, надо посчитать всевозможные суммы и сравнить их с числом B; Под всвозможными суммами я имею в виду выделить сначала первый элемент и сложить его со всеми , потом первыйй плюс второй, потом первый плюс 3, и так далее, нужно проделать с каждым номером, найти всевозможные суммы.
C++ Поиск одинаковых слов в тексте Решить на С++ с комментариями, если не сложно! :) Дан файл, содержащий текст на русском языке. Найти слова, встречающиеся в каждом предложении, или сообщить, что таких слов нет. подробнее

Показать сообщение отдельно
pihta
1 / 1 / 0
Регистрация: 11.11.2012
Сообщений: 23
07.03.2014, 23:00     Определить функции итератора, вне класса
Есть класс, к примеру очередь 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?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 00:26. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru