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

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

Войти
Регистрация
Восстановить пароль
 
alexsvk
8 / 8 / 1
Регистрация: 15.07.2010
Сообщений: 255
#1

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

21.07.2010, 20:22. Просмотров 1044. Ответов 4
Метки нет (Все метки)

Столкнулся впервые с указателями, используемыми в подобном примере. Для них не нужно задавать максимальное кол-во элементов, правильно понимаю? В коде выделил курсивом вопросы, относящиеся к пониманию процесса работы с указателями. Кто имеет время 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;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.07.2010, 20:22
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Работа с указателями в ООП (C++):

Работа с указателями - C++
Здравствуйте! Есть массив созданный ГСС. Надо написать функция которая вычисляет сколько в нем четных чисел, выделяет память под них и...

Работа с указателями - C++
Написать программу, в которой выполнить следующие действия: 1) Описать указатели на все известные типы данных; 2. Выполнить для каждого...

Работа с указателями - C++
#include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; void fun(int *p) { int *temp=new int; *temp=15; delete p; ...

работа с указателями - C++
Помогите решить задачу в С++ (я в этом начиющий): 1)Из положительных значений двух целочисленных массивов различной размерности...

Работа с указателями - C++
Помогите пожалуйста объяснить, не понимаю почему число присваемое через указатель *А в кавычках, и равны ли *А и просто А??? char *A =...

работа с указателями - C++
#include &lt;iostream&gt; using namespace std; int main() { char *res=&quot;&quot;; res=&quot;1&quot;; res=&quot;2&quot;; ...

4
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 прочитайте и попробуйте для начало стэки и однонаправленные очереди.Они по-проще.После этого вам станет легче разбираться с трудными вещами.
1
alexsvk
8 / 8 / 1
Регистрация: 15.07.2010
Сообщений: 255
21.07.2010, 20:44  [ТС] #3
Sekt, спасибо за ответы, но хотелось бы ответы не типа "теперь адрес tail = адрес item;" - ведь я это и сам понимаю, мне необходимо понять смысл этой строчки, но всё же, спасибо за Ваше время
0
nikkka
Мат в 32 хода
235 / 170 / 8
Регистрация: 10.09.2009
Сообщений: 1,096
21.07.2010, 21:04 #4
alexsvk, а программа что делать должна?
0
alexsvk
8 / 8 / 1
Регистрация: 15.07.2010
Сообщений: 255
21.07.2010, 21:41  [ТС] #5
nikkka, работа со стеком и очередью, но только спроектирована именно таким образом, как это сделать проще с массивами - знаю, но мне важно понимание указателей.
0
21.07.2010, 21:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.07.2010, 21:41
Привет! Вот еще темы с ответами:

Работа с указателями - C++
Расскажите как работает каждая строка в коде char *A = &quot;123456789&quot;; unsigned B = 1; char *X = A + B; char *Y = A - (-...

Работа с указателями - C++
Доброго времени суток! Прошу помощи в решении очень интересной задачи. Перепробовал все свои знания., не получается( Чаще всего...

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

Работа с указателями - C++
Написать программу работы с указателями. LONG *p1; ULONG x = 5; LONG y = -1; LONG *p2 = p1 + 50; p2 = p2 + x * y; *p2 = 1; ...


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

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

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