Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
 Аватар для Fixer_84
1505 / 969 / 812
Регистрация: 30.04.2016
Сообщений: 3,337

Перегрузка индексного оператора для шаблонного класса

22.08.2020, 02:00. Показов 1606. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, уважаемые форумчане! Подскажите, пожалуйста, как правильно перегрузить индексный оператор [] для шаблонного класса описанного ниже:

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
#include <iostream>
 
    using namespace std;
 
template <typename T>
    struct Node {
        T key;
        Node* next;
    };
 
template <class T>
    class vec {
        
        private:
 
            Node<T>* head;
 
        public:
 
            void add(T);
            //Node<T>* remove(T);
            //Node<T>* sort_inc();
            //Node<T>* sort_dec();
            //int size();
            void print();
 
        vec() {
                head = NULL;
            }
 
            ~vec() {
                while (head != NULL) {
                    Node<T>* temp = head->next;
                    delete head;
                    head = temp;
                }
            }
    };
 
template <typename T>
    void vec<T>::add(T key) {
        Node<T>* temp = new Node<T>;
        temp->key = key;
        temp->next = NULL;
        if (head == NULL) {
            head = temp;
        } else {
            Node<T>* ptr = head;
            while (ptr->next != NULL) {
                ptr = ptr->next;
            }
            ptr->next = temp;
        }
    }
 
template <typename T>
    void vec<T>::print() {
        if (head != NULL) {
            Node<T>* curr = head;
            while (curr != NULL) {
                cout << curr->key << " ";
                curr = curr->next;
            }
        } else {
            cout << "Empty!\n";
        }
    }
    
template <typename T>
    int vec<T>::size() {
        Node<T>* curr = head;
        int k = 0;
        while (curr != NULL) {
            k++;
            curr = curr->next;
        }
        return k;
    }
 
int main() {
    int n;
    vec<int> v;
    v.add(1);
    v.add(2);
    cout << v[0] << "\n";
    return 0;
}
То есть, нужно, чтобы v[0] что-то выводило. Пока возникает ошибка.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.08.2020, 02:00
Ответы с готовыми решениями:

Перегрузка оператора -> для шаблонного класса
Как это написать не понимаю помогите пожалуйста Добавлено через 23 секунды пример кода пожалуйста

Перегрузка оператора -> для шаблонного класса
Здравствуйте! Возникла проблема: не могу додуматься как перегрузить оператор -&gt; так, чтобы он корректно работал. Вот код: ...

Перегрузка оператора вывода для шаблонного класса vector<>
Здравствуйте, уважаемые форумчане! Получается добавлять примитивные типы и выводить их в шаблонном класcе, но когда речь идет о составных...

26
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
22.08.2020, 12:35
Студворк — интернет-сервис помощи студентам
может и так:
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
private:
  T& at_pos (size_t pos)
  {
 
            Node<T>* curr = head;
    for (int i = 0; i < pos && curr; i++) {
        curr = curr->next;
    }
    if (curr) {
        return curr->key;
    }
    throw std::out_of_range("out of range");
}
public:
T& operator[](size_t pos)
{
    return at_pos(pos);
}
 
const
T& operator[](size_t pos)const
{
    return at_pos(pos);
}
0
653 / 466 / 183
Регистрация: 23.04.2019
Сообщений: 1,987
22.08.2020, 15:06
Цитата Сообщение от Fixer_84 Посмотреть сообщение
так как индекс еще отрицательным может быть
если написать size_t, он никогда не будет отрицательным, зачем исправлять на int?
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
22.08.2020, 15:29
Цитата Сообщение от AndryS1 Посмотреть сообщение
если написать size_t, он никогда не будет отрицательным, зачем исправлять на int?
а если добавить счётчик для размера и проверять его при обращении, скорость чуть упадёт но можно попробовать избежать исключения. Хотя, как спрашивал Страуструп - А что тогда возвращать, если нечего возвращать...? В принципе, как бы ни был достигнут out_of_range его лучше всего-таки кинуть. А отрицательное значение - это очень большое положительное)
0
653 / 466 / 183
Регистрация: 23.04.2019
Сообщений: 1,987
22.08.2020, 15:37
Цитата Сообщение от IGPIGP Посмотреть сообщение
А отрицательное значение - это очень большое положительное
я это понимаю
Цитата Сообщение от IGPIGP Посмотреть сообщение
как бы ни был достигнут out_of_range
в операторе [] лично я против кидания исключения, это лишняя проверка, если пользователь всё-же хочет получать исключения (а если правильно писать, их просто будет), надо ему создать отдельную функцию на подобии std::vector::at
но если сделать так, чтобы исключение генерилось только в Debug, тогда проблем нет
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
22.08.2020, 15:40
Цитата Сообщение от AndryS1 Посмотреть сообщение
я это понимаю
Дык я же запосил в знак согласия. Я редко спорю и обычно пишу явно, если где не согласен. Именно об этом и говорил.
Цитата Сообщение от AndryS1 Посмотреть сообщение
в операторе [] лично я против кидания исключения, это лишняя проверка,
Тоже согласен. В stl так и сделано. Кому страшно, может at юзать, а иначе несправедливо. То есть те у кого прямые руки платят за тех кто может получить плохой индекс. Всё верно.
Вообще, [] для списка, - чисто учебная задача и глубокий анализ тут даже вреден.
1
653 / 466 / 183
Регистрация: 23.04.2019
Сообщений: 1,987
22.08.2020, 15:42
Цитата Сообщение от IGPIGP Посмотреть сообщение
Дык я же запосил в знак согласия
пардон, не сразу понял
1
 Аватар для Nishen
1359 / 857 / 366
Регистрация: 26.02.2015
Сообщений: 3,831
23.08.2020, 17:19
Цитата Сообщение от Fixer_84 Посмотреть сообщение
То есть, нужно, чтобы v[0]
Доступ по индексу в односвязном списке, да и вообще в списке - плохая идея, это очень долго, т.к. придётся прыгать по памяти туда-сюда в "поиске" нужного элемента.

Помимо этого, тебе не помешало бы определить копирующий конструктор/оператор и перемещающие конструктор/оператор, т.к. в текущей реализации содержимое вектора не копируются, а копируется только указатель, что может привести к двойному удалению данных, либо к обращению к уже удаленным данным.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.08.2020, 17:19

Перегрузка оператора вывода на консоль для шаблонного класса
Следующий код компилируется, но не линкуется: #include &lt;iostream&gt; using namespace std; template &lt;typename T&gt; class A ...

Перегрузить operator<<() для шаблонного класса (перегрузка оператора вывода)
Здравствуйте. Перегружаю оператор вывода для шаблонного класса. using namespace std; template &lt;class Element&gt; class List { ...

Перегрузка оператора для разных типов данных шаблонного класса
Создаю оператор инкремента. Как создать отдельный оператор инкремента для каждого типа объекта класса? Если допустим у меня будут несколько...

Перегрузка оператора << шаблонного класса
Всем доброго времени суток! Целый день бьюсь над перегрузкой оператора &lt;&lt; в шаблонном классе одномерный массив. Пока получилось родить...

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


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

Или воспользуйтесь поиском по форуму:
27
Ответ Создать тему
Новые блоги и статьи
Транслитерация текста с кириллицы на латиницу (вариант №2)
Maks 13.11.2026
Обновленная версия ранее созданной обработки. Добавлено: - Проверка исходного текста на кириллицу, через обращение к стандартной функции "ТолькоКириллицаВСтроке" из общего модуля. . .
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы. Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru