Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 22.12.2014
Сообщений: 32
1

Некорректно работает унаследованный метод класса

10.10.2017, 21:12. Показов 734. Ответов 2

Author24 — интернет-сервис помощи студентам
Всем доброго времени суток.

Есть класс List

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
#include <cstdlib>
#include <iostream>
using namespace std;
 
class List {
    struct Node {
        int value;
        Node *next;
    };
 
    Node *head;
    Node *tail;
 
public:
    List() {
        head = NULL;
        tail = NULL;
    }
 
    void AddNode(int value){
        Node *node = new Node;
        node->value = value;
        node->next = NULL;
        
        if (head == NULL) {
            head = tail = node;
        } else {
            tail->next = node;
            tail = node;
        }
    }
 
    void ShowList() {
        Node *tmp = new Node;
        tmp = head;
 
        cout << endl << "List is: ";
        while(tmp != NULL) {
            cout << tmp->value << " ";
            tmp = tmp->next;
        }
        cout << endl;
        
        delete tmp;
    }
 
    ~List() {
        while (head != tail) {
            Node *tmp = new Node;
            tmp = head;
            head = head->next;
            
            delete tmp;
        }
    }
};
И есть унаследованный класс DLinkedList

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
#include <cstdlib>
#include "List.h"
using namespace std;
 
class DLinkedList: public List {
    struct Node {
        int value;
        Node *next;
        Node *last;
    };
 
    Node *head;
    Node *tail;
 
public:
    DLinkedList() {
        head = NULL;
        tail = NULL;
    }
 
    void AddNode(int value) {
        Node *node = new Node;
        node->value = value;
        node->next = NULL;
        
        // если список пуст
        if (head == NULL) {
            head = tail = node;
            node->last = NULL;
        } else {
            node->last = tail;
            tail->next = node;
            tail = node;
        }
    }
/*
    void ShowList() {
        Node *tmp = new Node;
        tmp = head;
 
        cout << endl << "List is: ";
        while(tmp != NULL) {
            cout << tmp->value << " ";
            tmp = tmp->next;
        }
        cout << endl;
        
        delete tmp;
    }
*/
    ~DLinkedList() {
        while (head != tail) {
            Node *tmp = new Node;
            tmp = head;
            head = head->next;
            
            delete tmp;
        }
    }
};
В коде наследника есть закомментированный метод ShowList. Его код идентичен методу в родителе.
Однако же когда убираю его из наследника, не выводится список. В чем может быть ошибка?

main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include "DLinkedList.h"
#define MAX_REPEATS 10
 
int main() {
    List list;
    for(size_t i = 0; i < MAX_REPEATS; i++) {
        list.AddNode(i);
    }
    list.ShowList();
 
    DLinkedList dlist;
    for(size_t i = 5; i < MAX_REPEATS; i++) {
        dlist.AddNode(i);
    }
    dlist.ShowList();
    return 0;
}
Миниатюры
Некорректно работает унаследованный метод класса  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.10.2017, 21:12
Ответы с готовыми решениями:

Имеется класс TAddList, унаследованный от stl-класса списка. Требуется написать метод добавления
Здравствуйте уважаемые специалисты. Помогите пожалуйста с решением задачи. Задача : &quot;Имеется...

некорректно работает одна из функций класса
Здарова, в общем, пишу я тут класс для представления треугольника, в числе прочих этот класс...

Не получается создать объект унаследованный от абстрактного класса
Здравствуйте! Нужна помощь с виртуальными функциями, в теории понимаю что это, а вот с...

Массив как поле класса: цикл в основной функции работает некорректно
Ребят привет. Не могу понять в чем трабла... Цикл в основной функции работает не корректно... В чем...

2
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
11.10.2017, 11:59 2
head разный. Вы переопределили членов класса head, tail. + из базового они не будут видны, + они разных типов по отношению к базовому.
0
693 / 303 / 99
Регистрация: 04.07.2014
Сообщений: 846
11.10.2017, 17:23 3
Твой код сейчас более похож на, то что ты объявил два разных класса:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
 
class List {
public:
  struct Node {
    int value;
    Node *next;
  };
  List();
  // TODO: Реализовать правило пяти
  void push_back(int value);
  Node *getHead(); // добавил я, смотри ниже по тексту
 
private:
  Node *head;
  Node *tail;
};
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class DoublyLinkedList {
public:
  struct Node {
    int value;
    Node *next;
    Node *prev;
  };
  DoublyLinkedList();
  // TODO: Реализовать правило пяти
  void push_back(int value);
  Node *getHead(); // добавил я, смотри ниже по тексту
 
private:
  Node *head;
  Node *tail;
};
И если реализовать для этих классов методы получения головы списка, то получим простые функции возвращающие совершенно разные типы (о чём уже сказали):

C++
1
2
3
4
5
6
7
8
9
List::Node *List::getHead()
{
  return head;
}
 
DoublyLinkedList::Node *DoublyLinkedList::getHead()
{
  return head;
}
И для их использования нужны разные функции. В которых код отличается только типом.
Это можно сделать например через шаблоны:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
template <class T> void print(T &list)
{
  auto p = list.getHead();
  while (p) {
    std::cout << p->value << " ";
    p = p->next;
  }
  std::cout << "\n";
}
 
int main()
{
  List list;
  DoublyLinkedList dlist;
  for (int i = 0; i < 10; ++i) {
    list.push_back(i);
    dlist.push_back(i);
  }
  print(list);
  print(dlist);
  return 0;
}
Полный код:
Кликните здесь для просмотра всего текста

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
class List {
public:
  struct Node {
    int value;
    Node *next;
  };
  List();
  // TODO: Реализовать правило пяти
  void push_back(int value);
  Node *getHead();
 
private:
  Node *head;
  Node *tail;
};
 
class DoublyLinkedList {
public:
  struct Node {
    int value;
    Node *next;
    Node *prev;
  };
  DoublyLinkedList();
  // TODO: Реализовать правило пяти
  void push_back(int value);
  Node *getHead();
 
private:
  Node *head;
  Node *tail;
};
 
template <class T> void print(T &list)
{
  auto p = list.getHead();
  while (p) {
    std::cout << p->value << " ";
    p = p->next;
  }
  std::cout << "\n";
}
 
int main()
{
  List list;
  DoublyLinkedList dlist;
  for (int i = 0; i < 10; ++i) {
    list.push_back(i);
    dlist.push_back(i);
  }
  print(list);
  print(dlist);
  return 0;
}
 
List::List()
    : head(nullptr)
    , tail(nullptr)
{
}
 
void List::push_back(int value)
{
  Node *new_node = new Node({value, nullptr});
  if (!tail) {
    head = tail = new_node;
  } else {
    tail->next = new_node;
    tail = new_node;
  }
}
 
List::Node *List::getHead()
{
  return head;
}
 
DoublyLinkedList::DoublyLinkedList()
    : head(nullptr)
    , tail(nullptr)
{
}
 
void DoublyLinkedList::push_back(int value)
{
  Node *new_node = new Node({value, nullptr, tail});
  if (!tail) {
    head = tail = new_node;
  } else {
    tail->next = new_node;
    tail = new_node;
  }
}
 
DoublyLinkedList::Node *DoublyLinkedList::getHead()
{
  return head;
}


Но это теперь плохо, так как мы даём доступ к нашей структуре хранения данных.

Не по теме:

Зато метод вывода на экран выведен в отдельную функцию


Выход: Итераторы

Если же ты хочешь завести наследование. То лучше сделать базовые классы для списков и итераторов.
0
11.10.2017, 17:23
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.10.2017, 17:23
Помогаю со студенческими работами здесь

Некорректно работает метод show()
При нажатии на кнопку отправки формы, изначально спрятанный блок должен появиться.. Он появляется,...

Возвращаемый метод работает некорректно
Добрый день! Изучаю сейчас асинхронные методы. Столкнулся с проблемой, что при вводе неправильного...

Некорректно работает сериализация класса в одном из проектов
воообщем проблема следующая: сериализованый класс в части XML кода выдает &lt;LibraryElement...

Метод ортогонализации СЛАУ, код работает некорректно
Помогите пожалуйста разобраться где у меня ошибка в коде (документ с кодом снизу) Здесь задача...

Интеграция апплета в веб-приложение, некорректно работает метод repaint
Добрый день форумчане. Просьба помочь в решении вопроса, связанного с корректной перерисовкой...

Не работает метод класса
class Lines { private: char *line; public: void setLine(char *l) { int len =...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru