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

Основы ООП. Создание стека через класс - C++

Восстановить пароль Регистрация
 
Voron55555
0 / 0 / 0
Регистрация: 13.11.2012
Сообщений: 14
22.02.2013, 19:24     Основы ООП. Создание стека через класс #1
Приветствую всех пользователей форума. Относительно недавно начал осваивать ООП. Было необходимо выполнить следующее задание : нужно описать класс реализующий стек на примере формирования ж/д состава вагоны которого могут быть 2 типов. Конечно же есть некоторый жуткий прототип. Прошу уважаемых пользователей помочь мне в выявлении и пояснении этих ошибок. Среда Билдер. Вот прототип:
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
#include <iostream.h>
class steck 
 {
  public:
  bool t;
  steck *next;
  void vstavka(steck *d,bool x)
 {
   steck *p=new steck;
   p.t=x;
   p.next=*d;
   d=p;
 }
  void del(steck *d)
 {
  steck *p=d;
  d=d.next;
  delete p;
 }
  void prosmotr_el(steck d)
 {
  int i;
  for(;;)
 {
  i++;
  cout<<"vagon"<<i<<"tip vagona"<<d.t<<"\n";
  d=d.next;
 }
 }
  void poisk(steck *d,int j)
 {
  for(int i;i<j+1;i++) *d=*d.next;
 }
 };
main()
 {
  char n;
  steck *top;
  bool x;
  int d;
  for(;;)
 {
  cout<<"viberete deystvie\n";
  cout<<"1:sozdanie sostava i dobavka vagonov\n";
  cout<<"2:udalenie vagona\n";
  cout<<"3:prosmotr sostava\n";
  cout<<"q:vihod iz programmi\n";
  cin>>n;
  switch(n)
 {
 case '1':
   steck a;
   a.t=true;
   *top=&a;
   cout<<"sostav sozdan, viberete chislo vagonov i ih tip, perviy vagon po umolchaniyu - locomotiv\n";
   cin>>d;
  for(int i;i<d;i++)
 {
   cout<<"viberete vid vagona\n";
   cin>>x;
   a.vstavka(top,x);
 }
   break;
 case '2':
   cout<<"viberete nomer vagona\n";
   cin>>d;
   a.poisk(*top,d);
   a.del(*top);
   break;
 case '3':
   a.prosmotr_el(a);
   break;
 case 'q':
 return 0;
 }
 }
 }
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.02.2013, 19:24     Основы ООП. Создание стека через класс
Посмотрите здесь:

C++ ООП Создание основы класса
C++ Класс стека
Переписать реализацию стека с использованием ООП C++
Основы ООП, ввод данных C++
Знаю ли я основы ООП? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
22.02.2013, 19:41     Основы ООП. Создание стека через класс #2
Voron55555, если имеется указатель на объект, как например, steck *p, то обращаться к элементам объекта нужно так:

C++
1
2
3
p->t;
// или
(*p).t;
Voron55555
0 / 0 / 0
Регистрация: 13.11.2012
Сообщений: 14
22.02.2013, 20:52  [ТС]     Основы ООП. Создание стека через класс #3
Спасибо. К сожалению, еще не затронул данный матерьял в ООП.
Voron55555
0 / 0 / 0
Регистрация: 13.11.2012
Сообщений: 14
28.02.2013, 16:27  [ТС]     Основы ООП. Создание стека через класс #4
Что то все равно ничерта не пропускает компилятор. Вопрос по поводу кода: если я реализую указатель класса у которого полем является указатель, то синтаксис верен или мне нужно отдельно вносить в скобки и указатель и отдельно поле данного класса (которое является указателем)?
anmartex
...
 Аватар для anmartex
1700 / 1193 / 494
Регистрация: 12.02.2013
Сообщений: 1,978
28.02.2013, 19:29     Основы ООП. Создание стека через класс #5
Ну, приступим:

Строка 4, 5: нарушение инкапсуляции. Вы открыли сакральную часть класса.
Строка 7: зачем вы передаёте первым параметром стек? Сам класс является стеком (вернее объект данного класса), и именно в него должно быть добавление. Кроме этого, вы передаёте указатель d, который изменяете внутри метода, но из вне он не поменяется. И такой метода в определении стека обычно называют push (но это так, для информации).
Строка 14: аналогично строке 7, а именно, зачем передаёте стек? Объект класса stack и есть сам стек. И опять, значение указателя d поменяется только локально. (Такой метод обычно называют pop)
Строка 20: тут мы уже передаём d по значению. Я логику слабо улавливаю: 1 - зачем его вообще передавать; 2 - почему по значению, а не по указателю?
Строка 23: а какое условие выхода из этого цикла?
Строка 30: вечный вопрос, зачем передаём стек?
Строка 32: 1 - зачем разадресовываем d и присваиваем ему разадресованный next; 2 - а если d уже NULL, а j ещё не 0?; 3 - какой должен быть результат этого поиска?
Строка 35: я понимаю, что вы пользуетесь военным борландом, но всё же main должен что-то вернуть.
Строка 38: вы объявили стек, но даже не задали ему NULL. Прямая тропинка выстрелить себе в ногу. И это кстати будет если вы выберите команду 2 или 3 своей программы.
Строка 52: гениально, вы вспомните про время жизни переменных, правильно, в районе операторных скобок, а что мы видим в строке 54? А мы там видим как такая переменная разадресовывается и её адрес присваивается указателю top.

То, что нужно подтянуть:
  1. Понимание класса в целом. Вы в своём коде просто объединили переменные и функции (и даже не связали их вместе)
  2. Понимание указателя. Вы вообще не ориентируетесь, что такое указатель и как с ним работать.

P.S.: Пожалуйста, только без обид. Вы всё правильно делаете, что стараетесь. Но вы не думали, что может сначала посмотреть, как это реализовывают другие (в книгах, статьях, форумах)?
Voron55555
0 / 0 / 0
Регистрация: 13.11.2012
Сообщений: 14
28.02.2013, 19:36  [ТС]     Основы ООП. Создание стека через класс #6
Да что ты уважаемый? Я же искренне рад критике, так как кроме пользователей ресурса меня некому поставить на истинный путь. Спасибо тебе огромное за помощь.
Yandex
Объявления
28.02.2013, 19:36     Основы ООП. Создание стека через класс
Ответ Создать тему
Опции темы

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