Форум программистов, компьютерный форум CyberForum.ru

Работа с указателями в ООП - C++

Восстановить пароль Регистрация
 
alexsvk
8 / 8 / 1
Регистрация: 15.07.2010
Сообщений: 255
21.07.2010, 20:22     Работа с указателями в ООП #1
Столкнулся впервые с указателями, используемыми в подобном примере. Для них не нужно задавать максимальное кол-во элементов, правильно понимаю? В коде выделил курсивом вопросы, относящиеся к пониманию процесса работы с указателями. Кто имеет время 10 - 15 минут, ответьте, пожалуйста, на вопросы достаточно глубоко для правильного понимания. Спасибо

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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
#include <iostream>
#include <cstdlib>
#include <cctype>
using namespace std;
 
class list {
public:
    list *head; //указатель на начало списка
    list *tail; // указатель на конец списка
    list *next; // указатель на следующий элемент списка
    int num;    // число для хранения
 
    list() { head = tail = next = NULL; }
    virtual void store(int i) = 0;
    virtual int retrieve() = 0;
};
 
//создание списка типа очередь
class queue : public list {
public:
    void store(int i);
    int retrieve();
};
 
void queue::store(int i)
{
    list *item;
 
   [B] item = new queue;[/B] // [I]сколько памяти выделятеся, и как возможно преобразование от list  к queue?[/I]
    if(!item) {
        cout << "Ошибка выделения памяи\n";
        exit(1);
    }
    item->num = i;
 
    //добавление элемента в конце списка
    if(tail) tail->next = item;
   [B] tail = item;[/B]//[I] зачем приравнивание опять?[/I]
   [B] item->next = NULL;[/B] // [I]зачем эта строчка[/I]
    [B]if(!head) head = tail[/B];// [I]и что делает ф-но эта инструкция?[/I]
}
 
int queue::retrieve()
{
    int i;
    list *p;
 
    if(!head) {
        cout << "Список пуст\n";
        return 0;
    }
 
    // удаление элемента из начала списка
   [B] i = head->num;[/B] // [I]хотя номер добавлялся в tail->next[/I]
    [B]p = head[/B]; // [I]зачем нужен p?[/I]
    head = head->next;
    delete p;
 
    return i;
}
 
// stack
class stack : public list {
public:
    void store(int i);
    int retrieve();
};
 
void stack::store(int i)
{
    list *item;
 
    item = new stack;
    if(!item) {
        cout << "Ошибка выделения памяти\n";
        exit(1);
    }
    item->num = i;
 
    // добавление элемента в начало списка
  [B]  if(head) item->next = head; [/B]// что значит эта инструкция?
    head = item;
    if(!tail) tail = head;
[I]// в частности ф-ция store для стэка, что происходит?[/I]
}
 
int stack::retrieve()
{
    int i;
    list *p;
 
    if(!head) {
        cout << "\n";
        return 0;
    }
 
   
    i = head->num;
    p = head;
    head = head->next;
    delete p;
 
    return i;
}
 
int main()
{
    list *p; 
 
   
    queue q_ob; 
    p = &q_ob; //
 
    p->store(1); 
    p->store(2); 
    p->store(3); 
 
    cout <<  : ";
    cout << p->retrieve();
    cout << p->retrieve();
    cout << p->retrieve();
 
    cout << '\n';
 
    // äåìîГ*Г±ГІГ°Г*öèÿ Г±ГІГҐГЄГ*
    stack s_ob; 
    p = &s_ob; // 
    p->store(1); 
    p->store(2); 
    p->store(3); 
 
    cout << ": ";
    cout << p->retrieve();
    cout << p->retrieve();
    cout << p->retrieve();
 
    cout << '\n';
 
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.07.2010, 20:22     Работа с указателями в ООП
Посмотрите здесь:

Работа с указателями C++
C++ Работа с указателями
Работа с указателями C++
работа с указателями C++
C++ работа с указателями
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Sekt
 Аватар для Sekt
156 / 155 / 10
Регистрация: 29.04.2009
Сообщений: 637
21.07.2010, 20:35     Работа с указателями в ООП #2
Цитата Сообщение от alexsvk Посмотреть сообщение
сколько памяти выделяется, и как возможно преобразование от list к queue?
Это возможно т.к List базовый класс.Почитайте про наследование.

Цитата Сообщение от alexsvk Посмотреть сообщение
tail = item;[/B]// зачем приравнивание опять?
теперь адрес tail = адрес item;

Цитата Сообщение от alexsvk Посмотреть сообщение
item->next = NULL; // зачем эта строчка
инициализация элемента нулем.
Цитата Сообщение от alexsvk Посмотреть сообщение
if(!head) head = tail[/B];// и что делает ф-но эта инструкция? }
Если список пуст по начало равно концу.
Цитата Сообщение от alexsvk Посмотреть сообщение
i = head->num; // хотя номер добавлялся в tail->next
потом i возврашается в вашей функции.

Цитата Сообщение от alexsvk Посмотреть сообщение
p = head; // зачем нужен p?
Для удаления.Как мешок для мусора.Вы положили с начало мусор в мешок а потом (удалили)выкинули delete[].
Цитата Сообщение от alexsvk Посмотреть сообщение
if(head) item->next = head; [/B]// что значит эта инструкция?
элемент item хранит значения адреса head в своей переменной next;

Цитата Сообщение от alexsvk Посмотреть сообщение
/ в частности ф-ция store для стэка, что происходит?[/I]
добавляет элемент в стэк
P.s прочитайте и попробуйте для начало стэки и однонаправленные очереди.Они по-проще.После этого вам станет легче разбираться с трудными вещами.
alexsvk
8 / 8 / 1
Регистрация: 15.07.2010
Сообщений: 255
21.07.2010, 20:44  [ТС]     Работа с указателями в ООП #3
Sekt, спасибо за ответы, но хотелось бы ответы не типа "теперь адрес tail = адрес item;" - ведь я это и сам понимаю, мне необходимо понять смысл этой строчки, но всё же, спасибо за Ваше время
nikkka
Мат в 32 хода
 Аватар для nikkka
235 / 170 / 8
Регистрация: 10.09.2009
Сообщений: 1,096
21.07.2010, 21:04     Работа с указателями в ООП #4
alexsvk, а программа что делать должна?
alexsvk
8 / 8 / 1
Регистрация: 15.07.2010
Сообщений: 255
21.07.2010, 21:41  [ТС]     Работа с указателями в ООП #5
nikkka, работа со стеком и очередью, но только спроектирована именно таким образом, как это сделать проще с массивами - знаю, но мне важно понимание указателей.
Yandex
Объявления
21.07.2010, 21:41     Работа с указателями в ООП
Ответ Создать тему
Опции темы

Текущее время: 11:29. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru