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

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

22.08.2020, 02:00. Показов 1511. Ответов 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
Ответ Создать тему
Новые блоги и статьи
сукцессия 30. Фосфорный и азотный замки по "честному" закону лимитирования Либиха
anaschu 16.07.2026
Основные достижения за последние дни 1. Механизм отложенного высвобождения фосфора Добавлен специальный пул для медленного разложения меланизированных гиф ЕСМ Реализована разная скорость. . .
Запрет пометки на удаление и отмены проведения
Maks 16.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "ПутевойЛист" разработанного в КА2. Задача: запретить помечать на удаление и отменять проведения путевого листа при условии, если он сдан. . .
Как надо было делать правильно - вообще не слушать ИИ, его дело - текст.
Hrethgir 15.07.2026
А вообще надо было делать не так, чтобы не исправлять ошибку https:/ / www. cyberforum. ru/ blogs/ 223907/ 10996. html , правильно было : удалил кнопку, а потом добавил её. Всё это стресс конечно. Почему?. . .
Знаете, от чего появляется стресс?
kumehtar 15.07.2026
Стресс появляется оттого, что вы, зная как поступить правильно, делаете наоборот. Ларри Уингет
Нас бьют, а мы крепчаем? Какая чушь!
kumehtar 15.07.2026
Вот это вот бытующее мнение, что человек меняется только под действием проблем, всегда считал вредоносным. Поверь, от проблем у людей появляются не изменения, а нервное расстройство и ПТСР. А. . .
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru