С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
tytus
0 / 0 / 0
Регистрация: 29.04.2012
Сообщений: 15
#1

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

14.05.2012, 18:01. Просмотров 1056. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.05.2012, 18:01
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Односвязный список и оператор индексирования [] (C++):

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

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

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

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

Создать двусвязный список групп факультета, где каждая группа представляет собой односвязный список студентов - C++
Задание: создайте двусвязный список групп факультета. Каждая группа представляет собой односвязный список студентов. Помогите пожалуйста,...

Задали односвязный линейный список с целыми числами. Создать новый список, который содержит элементы заданного списка в обратном порядке - C++
Задали односвязный линейный список с целыми числами. Создать новый список, который содержит элементы заданного списка в обратном порядке.

15
Avazart
Эксперт С++
7262 / 5434 / 304
Регистрация: 10.12.2010
Сообщений: 24,165
Записей в блоге: 17
14.05.2012, 18:12 #2
C++
1
 MyList[i] ->....
Но кода мало чтоб понять что требуется
0
tytus
0 / 0 / 0
Регистрация: 29.04.2012
Сообщений: 15
14.05.2012, 18:25  [ТС] #3
Допустим, у каждого объекта 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
muskos
6 / 6 / 0
Регистрация: 06.03.2012
Сообщений: 82
14.05.2012, 18:26 #4
Может я туплю, но...
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
tytus
0 / 0 / 0
Регистрация: 29.04.2012
Сообщений: 15
14.05.2012, 18:28  [ТС] #5
C++
1
pTemp = Mylist->operator[](i)
<----- что-то мне не нравится, не по-людски как-то...
0
Avazart
Эксперт С++
7262 / 5434 / 304
Регистрация: 10.12.2010
Сообщений: 24,165
Записей в блоге: 17
14.05.2012, 18:28 #6
Почему не просто
C++
1
 int n = MyList[i]->Width;
0
tytus
0 / 0 / 0
Регистрация: 29.04.2012
Сообщений: 15
14.05.2012, 18:30  [ТС] #7
to: muskos
твой пост наверное для массивов... не подходит мне...
0
muskos
6 / 6 / 0
Регистрация: 06.03.2012
Сообщений: 82
14.05.2012, 18:31 #8
Цитата Сообщение от Avazart Посмотреть сообщение
Почему не просто
C++
1
 int n = MyList[i]->Width;
Надо ещё в месте перегрузке указать что возвращаем! Так?

Добавлено через 29 секунд
Цитата Сообщение от tytus Посмотреть сообщение
to: muskos
твой пост наверное для массивов... не подходит мне...
Список и очередь - есть массив))) тока по разному работает)
0
Avazart
Эксперт С++
7262 / 5434 / 304
Регистрация: 10.12.2010
Сообщений: 24,165
Записей в блоге: 17
14.05.2012, 18:31 #9
tytus, вы не пишите весь код и предполагаете что мы будем гадать?
Где например само поле Width?Где описанияе самих методов и операторов?
0
gray_fox
What a waste!
1522 / 1227 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
14.05.2012, 18:39 #10
Цитата Сообщение от 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
muskos
6 / 6 / 0
Регистрация: 06.03.2012
Сообщений: 82
14.05.2012, 18:46 #11
да, мне почему-то кажется, что в этом сложном вопросе - всё просто...Я бы вначале вернул что-либо в перегрузке индексации...т.е. написал бы
C++
1
2
3
4
[S]TMyObject*[/S] operator[](int Index)
{
return [S]Mylist[/S][Index];
}
а потом бы просто обращался бы MyList[i];
0
tytus
0 / 0 / 0
Регистрация: 29.04.2012
Сообщений: 15
15.05.2012, 12:38  [ТС] #12
а как обойтись без шаблонов?
Вот так не работает:
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
gray_fox
What a waste!
1522 / 1227 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
15.05.2012, 13:01 #13
Цитата Сообщение от tytus Посмотреть сообщение
"Выражение должно иметь тип указателя"
Правильно ругется, operator [] возвращает ссылку, а не указатель.+ я вижу PanelList указатель, надо его сначала разыменовать. Так попробуй:
C++
1
(*PanelList)[0].Width
1
muskos
6 / 6 / 0
Регистрация: 06.03.2012
Сообщений: 82
15.05.2012, 13:29 #14
tytus, Сорри....Я ещё только учюсь) Перегружал [] без шаблонов...Вот сейчас сделал лабу - чтение из файла по буквам(с перегрузкой [])..ю
Так что извиняй, дальше не помогу)
0
tytus
0 / 0 / 0
Регистрация: 29.04.2012
Сообщений: 15
15.05.2012, 13:43  [ТС] #15
C++
1
 (*PanelList)
- это разыменование? Я не знаю поэтому и спрашиваю...
По-моему это разыменование с привидением типов... Если нет - объясни популярнее...плз.

Добавлено через 1 минуту
to gray_fox:
подскажи как корректно почистить за собой память, касательно
TPanel и TPanelNode.
0
15.05.2012, 13:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.05.2012, 13:43
Привет! Вот еще темы с ответами:

Односвязный список - C++
Где можно прочитать про это? Чтобы было просто написано: как создать список, как добавить туда элементы, как удалить список. 4 учебника...

Односвязный список - C++
Всем привет. Помогите разобраться с односвязным списком. Вот собственно и вопросы: 1) Если я правильно понял то список это чтото вроде...

Односвязный список C++ - C++
помогите решить проблему с выводом суммы, буду благодарен #include &lt;iostream&gt; #include &lt;cctype&gt; using namespace std; struct...

Односвязный список. - C++
Привет -_- В моем понимании односвязный список это типо прямоугольнички, состоящие из двух - в одном из них типо содержание...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.