Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.95/21: Рейтинг темы: голосов - 21, средняя оценка - 4.95
3 / 3 / 1
Регистрация: 02.03.2013
Сообщений: 231

Реализация итератора для шаблонного класса

05.05.2019, 14:34. Показов 4557. Ответов 29

Студворк — интернет-сервис помощи студентам
Изучаю С++. Решил реализовать свой вариант контейнера vector. Класс решил сделать шаблонным. Чтобы следовать идеи интерфейс - реализация, создал два файла:
  1. vector.hpp - интерфейс;
  2. vector.cpp - реализация.

Файл vector.hpp:
C++
1
2
3
4
5
6
7
template <class T> class Vector
{
  Vector();
  ещё много всего
};
 
#include "../src/vector.cpp"
Файл vector.cpp:
C++
1
2
3
4
5
template<class T>
Vector<T>::Vector()
  :size_(10), capacity_(20), data_(new T[capacity_])
{}
 ещё много всего
В файл vector.cpp добавил следующие строки:
C++
1
2
3
  class Iterator;
  Iterator begin();
  Iterator end();
Не могу понять, как мне реализовать эти(а в перспективе и другие) функции в файле vector.cpp . Банально не могу разобраться с синтаксисом.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.05.2019, 14:34
Ответы с готовыми решениями:

Реализация шаблонного класса
List_Node.h: #ifndef _List_Node_H #define _List_Node_H template &lt;class Type&gt; class ListNode { public: Type...

Реализация методов шаблонного класса
Можно ли вынести реализацию конструкторов, методов за пределы шаблонного класса? Допустим вот хедэр template &lt;typename T&gt;...

Как корректно передать в метод шаблонного класса объект шаблонного класса в качестве параметра?
header.h template &lt;class T&gt; class MyVector { public: void swap(MyVector&lt;T&gt;Vector); } template &lt;class T&gt; void...

29
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
05.05.2019, 22:30
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от schoolboy_ Посмотреть сообщение
Не могу понять, как мне реализовать
для начала - убрать
Цитата Сообщение от schoolboy_ Посмотреть сообщение
vector.cpp:
можешь переименовать его в vector.inl,
если тебе так сильно хочется разделить класс на хедер и реализацию.
но он не должен иметь расширение .cpp

потому что не нужно начинать работу с непотребства.
0
3 / 3 / 1
Регистрация: 02.03.2013
Сообщений: 231
06.05.2019, 06:40  [ТС]
hoggy, хорошо. Как мне разобраться с остальным? Как сделать так, чтобы проект компилировался.
0
 Аватар для zayats80888
6354 / 3525 / 1428
Регистрация: 07.02.2019
Сообщений: 9,000
06.05.2019, 07:46
Цитата Сообщение от schoolboy_ Посмотреть сообщение
Как сделать так, чтобы проект компилировался.
что то в этом духе
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
//Vector.hpp
#pragma once
 
template <class T> class Vector
{
public:
    Vector();
    class Iterator;
    Iterator begin();
    Iterator end();
    //ещё много всего
private:
    T* data;
    size_t size;
};
 
template<class T>
class Vector<T>::Iterator
{
    T* currentElement;
public:
    Iterator(T* first);
 
    Iterator operator+ (size_t n);
    Iterator operator- (size_t n);
 
    Iterator operator++ (int);
    Iterator operator-- (int);
 
    Iterator& operator++ ();
    Iterator& operator-- ();
 
    bool operator!= (Iterator const  &iterator);
    bool operator== (Iterator const  &iterator);
 
    T& operator* ();
    //...
};
 
 
//...
template<class T> inline
Vector<T>::Iterator Vector<T>::Iterator::operator+(size_t n)
{
    return Iterator(currentElement + n);
}
//...
template<class T> inline
Vector<T>::Iterator& Vector<T>::Iterator::operator++()
{
    ++currentElement;
    return *this;
}
//...
 
template<class T> inline
Vector<T>::Iterator Vector<T>::begin()
{
    return Iterator(data);
}
 
template<class T> inline
Vector<T>::Iterator Vector<T>::end()
{
    return Iterator(data + size);
}
//...
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
06.05.2019, 13:30
Цитата Сообщение от schoolboy_ Посмотреть сообщение
хорошо. Как мне разобраться с остальным? Как сделать так, чтобы проект компилировался.
сначала разберись с первым.
0
3 / 3 / 1
Регистрация: 02.03.2013
Сообщений: 231
06.05.2019, 19:42  [ТС]
zayats80888, а как работают методы begin() и end() ? Почему это вообще компилируется? Типы же не совпадают. В объявлении, я говорю, что функции должны возвращать объект типа Iterator, а в реализации возвращаю тип T*.
0
 Аватар для zayats80888
6354 / 3525 / 1428
Регистрация: 07.02.2019
Сообщений: 9,000
06.05.2019, 20:05
Цитата Сообщение от schoolboy_ Посмотреть сообщение
а в реализации возвращаю тип T*.
это по вашему Т* ?
C++
1
return Iterator(data);
1
3 / 3 / 1
Регистрация: 02.03.2013
Сообщений: 231
06.05.2019, 20:19  [ТС]
можешь переименовать его в vector.inl,
если тебе так сильно хочется разделить класс на хедер и реализацию.
но он не должен иметь расширение .cpp

потому что не нужно начинать работу с непотребства.
Я решил делать по другому. Разделю на два файла: vector.hpp и vector_impl.hpp.

Добавлено через 12 минут
zayats80888, я не так писал, спасибо. Но что означает эта строчка? Мы возвращаем объект типа вектор, который проинициализирован указателем на начало массива? Аналогично и для функции end (с поправкой на конец массива)? А благодаря перегрузке операторов == и != мы можем их сравнивать?
0
 Аватар для zayats80888
6354 / 3525 / 1428
Регистрация: 07.02.2019
Сообщений: 9,000
06.05.2019, 20:21
Цитата Сообщение от schoolboy_ Посмотреть сообщение
Мы возвращаем объект типа вектор
Какой вектор? Итератор возвращаем

Добавлено через 19 секунд
Цитата Сообщение от schoolboy_ Посмотреть сообщение
А благодаря перегрузке операторов == и != мы можем их сравнивать?
можем
1
3 / 3 / 1
Регистрация: 02.03.2013
Сообщений: 231
06.05.2019, 20:24  [ТС]
Какой вектор? Итератор возвращаем
ну в смысле да. Я опечатался. Извините.

Но тогда данная строчка не работает:
C++
1
 auto iterator = Vector<int>::Iterator(v.begin());
Я хотел инициализировать итератор нужным значением. Поэтому у меня реализация была такая:
C++
1
2
3
4
template<class T>
typename Vector<T>::Iterator Vector<T>::begin() {
  return data_;
}
0
 Аватар для zayats80888
6354 / 3525 / 1428
Регистрация: 07.02.2019
Сообщений: 9,000
06.05.2019, 20:36
Цитата Сообщение от schoolboy_ Посмотреть сообщение
Но тогда данная строчка не работает:
Все работает(код не полноценный, лень писать, но компилируется)
Header.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
//Vector.hpp
#pragma once
 
template <class T> class Vector
{
public:
    Vector() {};
    class Iterator;
    Iterator begin();
    Iterator end();
    //ещё много всего
private:
    T* data;
    size_t size;
};
 
template<class T>
class Vector<T>::Iterator
{
    T* currentElement;
public:
    Iterator(T* first):currentElement(first) {};
 
    Iterator operator+ (size_t n);
    Iterator operator- (size_t n);
 
    Iterator operator++ (int);
    Iterator operator-- (int);
 
    Iterator& operator++ ();
    Iterator& operator-- ();
 
    bool operator!= (Iterator const  &iterator);
    bool operator== (Iterator const  &iterator);
 
    T& operator* ();
    //...
};
 
 
//...
template<class T> inline
typename Vector<T>::Iterator Vector<T>::Iterator::operator+(size_t n)
{
    return Iterator(currentElement + n);
}
//...
template<class T> inline
typename Vector<T>::Iterator& Vector<T>::Iterator::operator++()
{
    ++currentElement;
    return *this;
}
//...
 
template<class T> inline
typename Vector<T>::Iterator Vector<T>::begin()
{
    return Iterator(data);
}
 
template<class T> inline
typename Vector<T>::Iterator Vector<T>::end()
{
    return Iterator(data + size);
}
//...
source.cpp
C++
1
2
3
4
5
6
7
8
#include "Header.h"
 
int main()
{
    Vector<int> v;
    auto iter1 = Vector<int>::Iterator(v.begin());//нафига так
    auto iter2 = v.begin();//если можно так
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.05.2019, 20:36

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

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

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

Перегрузка << , >> для шаблонного класса
Доброго времени суток всем! Данная тема не раз подымалась на форуме.. Но есть но.. Помогите перегрузить операторы побитового сдвига для...

Перегрузка для шаблонного класса
Есть шаблонный класс, который определен в заголовочном файле(list.h) Определение перегрузки вывода во втором файле(list.cpp) Компилятор...


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru