Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
0 / 0 / 0
Регистрация: 29.04.2012
Сообщений: 15

Односвязный список и оператор индексирования []

14.05.2012, 18:01. Показов 3648. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите разобраться, как сделать оператор доступа по индексу для односвязного спика.
Объявление:
C++
1
2
3
4
5
6
7
8
9
10
class TMyObject()
{
 
};
 
class TMyObjectList()
{
public:
  TMyObject* operator[](int Index) const;
};
Реализация:
C++
1
2
3
4
5
TMyObject* TMyObjectList::operator[](int Index) const
{
  ...
  return pMyObject;
}
Так вто, как мне теперь обратится к элементу списка?
C++
1
2
3
4
TMyObjectList* MyList = new TMyObjectlist();
...
for (int i= 0; i<MyList.Count; i++)
  MyList[i]
<------?????????????
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.05.2012, 18:01
Ответы с готовыми решениями:

Оператор индексирования [] С++
Я перегрузил оператор индексирования таким образом: float* operator (unsigned int i){return arr;} я не уверен в том что я корректно...

Оператор индексирования как утилита
Нужно сделать оператор индексирования (operator) утилитой, тоесть вне класа. Не знаю зачем пока, но сделать надо. Можете мне объяснить...

Класс для работы с матрицами - Что дает перегруженный оператор индексирования?
Есть работающая программа, которая имеет: конструктор с параметрами, который заполняет матрицу псевдослучайными числами конструктор...

15
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
14.05.2012, 18:12
C++
1
 MyList[i] ->....
Но кода мало чтоб понять что требуется
0
0 / 0 / 0
Регистрация: 29.04.2012
Сообщений: 15
14.05.2012, 18:25  [ТС]
Допустим, у каждого объекта TMyObject есть свойство Width:

C++
1
2
3
4
5
6
class TMyObject()
{
public:
  int GetWidth();
  __declspec(property(get=GetWidth))int Width;
};
Класс списка оставим без изменения...
C++
1
2
3
4
5
class TMyObjectList()
{
public:
  TMyObject* operator[](int Index) const;
};
Реализацию односвязного списка также опустим для экономии места...
Вопрос вот в чем: как мне прочитать свойства Width?
C++
1
2
3
  TMyObject* pTemp;
  pTemp = MyList->operator[](i);
  int n = pTemp->Width;
Вот так компилятор не ругается, но работоспособность еще не проверил...
0
6 / 6 / 0
Регистрация: 06.03.2012
Сообщений: 82
14.05.2012, 18:26
Может я туплю, но...
C++
1
2
operator[](int i)
      { return f[i];}
перегрузили.

C++
1
   cout << ff[i] << endl;
обратились

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

C++
1
return pMyObject[index];
Поправьте, если я не прав) а то сам не до конца понимаю перегрузку индексации)
вот в этой книге - есть про перегрузку оператора...

alfoot.net/lucik_op.doc
0
0 / 0 / 0
Регистрация: 29.04.2012
Сообщений: 15
14.05.2012, 18:28  [ТС]
C++
1
pTemp = Mylist->operator[](i)
<----- что-то мне не нравится, не по-людски как-то...
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
14.05.2012, 18:28
Почему не просто
C++
1
 int n = MyList[i]->Width;
0
0 / 0 / 0
Регистрация: 29.04.2012
Сообщений: 15
14.05.2012, 18:30  [ТС]
to: muskos
твой пост наверное для массивов... не подходит мне...
0
6 / 6 / 0
Регистрация: 06.03.2012
Сообщений: 82
14.05.2012, 18:31
Цитата Сообщение от Avazart Посмотреть сообщение
Почему не просто
C++
1
 int n = MyList[i]->Width;
Надо ещё в месте перегрузке указать что возвращаем! Так?

Добавлено через 29 секунд
Цитата Сообщение от tytus Посмотреть сообщение
to: muskos
твой пост наверное для массивов... не подходит мне...
Список и очередь - есть массив))) тока по разному работает)
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
14.05.2012, 18:31
tytus, вы не пишите весь код и предполагаете что мы будем гадать?
Где например само поле Width?Где описанияе самих методов и операторов?
0
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
14.05.2012, 18:39
Цитата Сообщение от tytus Посмотреть сообщение
как сделать оператор доступа по индексу для односвязного спика.
Ничего не понял в приведённом коде, так что на абстрактном примере:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
template<typename T>
class single_list {
    
    struct node {
        T data;
        node * next;
    };
    
public:
    T & operator [](std::size_t index) {
        node * p = head;
        while (index--) {
            p = p->next;
        }
        return p->data;
    }    
    
private:
    node * head;
};
1
6 / 6 / 0
Регистрация: 06.03.2012
Сообщений: 82
14.05.2012, 18:46
да, мне почему-то кажется, что в этом сложном вопросе - всё просто...Я бы вначале вернул что-либо в перегрузке индексации...т.е. написал бы
C++
1
2
3
4
[S]TMyObject*[/S] operator[](int Index)
{
return [S]Mylist[/S][Index];
}
а потом бы просто обращался бы MyList[i];
0
0 / 0 / 0
Регистрация: 29.04.2012
Сообщений: 15
15.05.2012, 12:38  [ТС]
а как обойтись без шаблонов?
Вот так не работает:
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
// ListTest.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include <iostream>
 
class TPanel
{
public:
    TPanel(int width){m_Width = width;};
    ~TPanel();
    int m_Width;
    int GetWidth(){return m_Width;};
    void SetWidth(int newWidth){m_Width = newWidth;};
    __declspec(property(get=GetWidth, put=SetWidth)) int Width;
};
 
class TPanelNode
{
public:
    TPanelNode(){pNext = nullptr;};
    ~TPanelNode();
    TPanelNode* pNext;  
    TPanel* Panel;
    TPanel& GetPanel(){return *Panel;};
};
 
class TPanelsList
{
public:
    TPanelsList(){pHead = nullptr; m_Count = 0;};
    ~TPanelsList();
    void AddPanel(int width);
    const TPanel& operator[](int Index) const;
    int GetCount(){return m_Count;};
    __declspec(property(get=GetCount)) int Count;
private:
    TPanelNode* pHead;
    int m_Count;
};
 
void TPanelsList::AddPanel(int width)
{
    if (!pHead)
    {
        pHead = new TPanelNode();
        pHead->Panel = new TPanel(width);
    }
    else
    {
        TPanelNode* pTemp = pHead;
        while (pTemp->pNext)
            pTemp = pTemp->pNext;
        pTemp->pNext = new TPanelNode;
        pTemp = pTemp->pNext;
        pTemp->Panel = new TPanel(width);       
    }
    ++m_Count;
}
 
const TPanel& TPanelsList::operator[](int Index) const
{
    int indx = Index;
    TPanelNode* pTemp = pHead;
    while (indx > 0)
    {
        if (pTemp->pNext)
            pTemp = pTemp->pNext;
        else
            break;
        --indx;
    }
    return pTemp->GetPanel();
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    TPanelsList* PanelsList = new TPanelsList();
    std::cout << PanelsList->Count << "\n";
    PanelsList->AddPanel(20);
    std::cout << PanelsList->Count << "\n"; 
    PanelsList->AddPanel(30);
    std::cout << PanelsList->Count << "\n";
    std::cout << "Panel1 width: " << PanelsList[0]->Width << "\n";
    
 
    std::cin.get();
    return 0;
}
Добавлено через 1 минуту
C++
1
PanelsList[0]->Width
ругается: "Выражение должно иметь тип указателя"
0
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
15.05.2012, 13:01
Цитата Сообщение от tytus Посмотреть сообщение
"Выражение должно иметь тип указателя"
Правильно ругется, operator [] возвращает ссылку, а не указатель.+ я вижу PanelList указатель, надо его сначала разыменовать. Так попробуй:
C++
1
(*PanelList)[0].Width
1
6 / 6 / 0
Регистрация: 06.03.2012
Сообщений: 82
15.05.2012, 13:29
tytus, Сорри....Я ещё только учюсь) Перегружал [] без шаблонов...Вот сейчас сделал лабу - чтение из файла по буквам(с перегрузкой [])..ю
Так что извиняй, дальше не помогу)
0
0 / 0 / 0
Регистрация: 29.04.2012
Сообщений: 15
15.05.2012, 13:43  [ТС]
C++
1
 (*PanelList)
- это разыменование? Я не знаю поэтому и спрашиваю...
По-моему это разыменование с привидением типов... Если нет - объясни популярнее...плз.

Добавлено через 1 минуту
to gray_fox:
подскажи как корректно почистить за собой память, касательно
TPanel и TPanelNode.
0
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
15.05.2012, 14:10
Цитата Сообщение от tytus Посмотреть сообщение
(*PanelList)
Скобки для указания приоритета операций: сначало разыменование, потом оператор индексации.
Цитата Сообщение от tytus Посмотреть сообщение
подскажи как корректно почистить за собой память, касательно
TPanel и TPanelNode.
Написать деструктор для TPanelList, там всё очищать. Или лучше перенести выделение памяти для TPanel в конструктор TPanelNode, тогда удалять TPanel'ы надо в деструкторе TPanelNode.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.05.2012, 14:10
Помогаю со студенческими работами здесь

Не обращается через оператор индексирования к QList
По идее память и не нужно в куче выделять, но раз возникла ошибка решил спросить, по чему не работает нижеприведенный код? ...

Сформировать список из 10 книг, используя динамическую структуру данных односвязный список
друзья спасайте Сформировать список из 10 книг, используя динамическую структуру данных односвязный список С++

Создать односвязный список, затем вывести весь список в ListBox
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace std; class List { public: string Element; List...

Создать класс «Квартира», в котором список комнат реализовать как односвязный список
Добрый день,написал фот такой клас по заданию:Создать класс «Квартира», в котором список комнат реализовать как односвязный список....

Односвязный список: заносить в новый список элементы исходного, которые больше заданного значения
Можете пожалуйста помочь в решении проблемы не. Не могу создать функцию которая будет с созданного заранее списка заносить в новый элементы...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru