Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
1 / 1 / 0
Регистрация: 05.07.2013
Сообщений: 176

Почему мой класс абстрактный?

07.05.2015, 19:46. Показов 2064. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Container.h
Кликните здесь для просмотра всего текста
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
#pragma once
 
/**
 * Базовый класс для всех контейнеров
 */
 
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include "MemoryManager.h"
 
using namespace std;
 
/**
 * Базовый класс для всех абстрактных контейнеров
 */
class Container {
protected:
  MemoryManager &_memory;
 
public:
  /**
   * Базовый класс для исключений, которые запускает контейнер
   */
  struct Error {
    char msg[256];
    Error(const char *err_msg) { strcpy(msg, err_msg); }
  };
 
  class Iterator {
  public:
    /**
     * Возврашает явно указатель на элемент, на который указывает итератор в
     * данный момент.
     * Неявно возвращает размер данных
     */
    virtual void *getElement(size_t &size) = 0;
 
    /**
     * Возвращает true, если есть следующий элемент, иначе false.
     */
    virtual bool hasNext() = 0;
 
    /**
     * Переход к следующему элементу.
     */
    virtual void goToNext() = 0;
 
    /**
     * Проверка на равенство итераторов.
     */
    virtual bool equals(Iterator *right) = 0;
  };
 
  Container(MemoryManager &mem) : _memory(mem) {}
 
  /**
   * Функция возвращает значение, равное количеству элементов в контейнере.
   */
  virtual int size() = 0;
 
  /**
   * Функция возвращает значение, равное максимальной вместимости контейнера в
   * байтах.
   */
  virtual size_t max_bytes() = 0;
 
  /**
   * Функция возвращает указатель на итератор, указывающий на первый найденный в
   * контейнере элемент. Если элемент не найден, возвращается пустой указатель.
   */
  virtual Iterator *find(void *elem, size_t size) = 0;
 
  /**
   * Удаление всех элементов из контейнера.
   */
  virtual void clear() = 0;
 
  /**
   * Создание итератора, соответствующего данному типу контейнера.
   */
  virtual Iterator *newIterator() = 0;
 
  /**
   * Функция возвращает указатель на итератор, указывающий на первый элемент
   * контейнера. Если контейнер пустой, возвращается нулевой указатель.
   */
  virtual Iterator *begin() = 0;
 
  /**
   * Функция возвращает указатель на итератор, указывающий позицию за последним
   * элементом контейнера. Если контейнер пустой, возвращается нулевой
   * указатель.
   */
  virtual Iterator *end() = 0;
 
  /**
   * Eсли контейнер пуст возвращает true, иначе false
   */
  virtual bool empty() = 0;
 
  /**
   * Удаление элемента из позиции, на которую указывает итератор iter.
   * После удаления итератор указывает на следующий за удаленным элемент.
   */
  virtual void remove(Iterator *iter) = 0;
};


GroupContainer.h
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
#pragma once
 
#include "Container.h"
 
/**
 * Базовый класс для некоторой группы абстрактных контейнеров.
 */
class GroupContainer : public Container {
public:
  GroupContainer(MemoryManager &mem) : Container(mem) {}
};


Tree.h
Кликните здесь для просмотра всего текста
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
#pragma once
 
#include "GroupContainer.h"
#include "MemoryManager.h"
 
/**
 * Абстрактный класс: дерево
 */
class AbstractTree : public GroupContainer {
public:
  class Iterator : public Container::Iterator {
  public:
    /**
     * Переход к родительской вершине. Возвращает false если текущая вершина -
     * корень или end().
     */
    virtual bool goToParent() = 0;
 
    /**
     * Переход к дочерней вершине № child_index. Возвращает false если дочерней
     * вершины с таким номером нет.
     */
    virtual bool goToChild(int child_index) = 0;
  };
 
  /**
   * конструктор
   */
  AbstractTree(MemoryManager &mem) : GroupContainer(mem) {}
 
  /**
   * деструктор
   */
  virtual ~AbstractTree() {}
 
  /**
   * Добавление элемента как дочернюю вершину № child_index вершины, на которую
   * указывает итератор. В случае успешного добавления функция возвращает
   * значение 0, в случае неудачи 1.
   */
  virtual int insert(Iterator *iter, int child_index, void *elem,
                     size_t size) = 0;
 
  /**
   * Удаление вершины, на которую указывает итератор. Если leaf_only==1 и
   * вершина не является листом, возвращает false
   * !!! Примечание: метод remove удаляет вершину вместе со всеми ее потомками
   */
  virtual bool remove(Iterator *iter, int leaf_only) = 0;
};


Классы RBtree и Iterator абстрактные и не могу понять почему...
Кликните здесь для просмотра всего текста
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
#pragma once
 
#include "Tree.h"
 
enum color { RED, BLACK };
 
class Node {
  int *data;
  color color;
  Node *left;
  Node *right;
  Node *parrent;
 
public:
  Node(int *data)
      : left(NULL), right(NULL), parrent(NULL), color(RED), data(data){};
  ~Node() { delete data; };
 
public:
  friend class RBtree;
};
 
class RBtree : public AbstractTree {
public:
  class Iterator : public AbstractTree::Iterator {
    RBtree *Rbtree;
 
  public:
    Node *cur;
 
  public:
    Iterator(Node *n) : cur(n){};
    ~Iterator(){};
 
    /**
     * Виртуальные функции
     */
 
  public:
    void *getElement(size_t &size); // done!
    bool hasNext();                 // done!
    void goToNext();                // done!
    bool equals(Iterator *right);   // done!
 
    bool goToParent();               // done!
    bool goToChild(int child_index); // done!
  };
 
private:
  Node *root;
  Node *NIL;
 
public:
  RBtree(MemoryManager &mem);
  ~RBtree(){};
 
  /**
   * Пользовательские функции
   */
public:
  void tree_insert(Node *n);
  void left_rotate(Node *n);
  void right_rotate(Node *n);
  void rb_insert(Node *n);
  Node *rb_delete(Node *n);
  void rb_delete_fixup(Node *n);
  Node *tree_successor(Node *n);
  Node *tree_predecessor(Node *n);
  void inorder_tree_walk(Node *n);
  void inorder_tree_walk_count(Node *n, int *count);
  void inorder_tree_walk_delete(Node *n);
  Node *iterative_tree_search(Node *n, int *data);
  Node *tree_minimum(Node *n);
  Node *tree_maximum(Node *n);
 
  /**
   * Виртуальные функции
   */
  int size();                              // done!
  size_t max_bytes();                      // ???
  Iterator *find(void *elem, size_t size); // ???
  void clear();                            // done!
  Iterator *newIterator();                 // ???
  Iterator *begin();                       // ???
  Iterator *end();                         // ???
  bool empty();                            // done!
  void remove(Iterator *iter){};
 
  int insert(Iterator *iter, int child_index, void *elem, size_t size);
  bool remove(Iterator *iter, int leaf_only);
};


Помогите пожалуйста.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.05.2015, 19:46
Ответы с готовыми решениями:

Класс: Разработать абстрактный класс класс Point для задания координаты...
Всем привет, помогите пожалуйста решить задачу, я уже всю голову сломал, не знаю как решить... Разработать абстрактный класс класс...

Создать иерархию классов Figure
Создать абстрактный базовый класс Figure с виртуальными методами вычисления площади и периметра. Создать производные классы: Rectangle...

Абстрактный класс, наследование, класс хранится в другом классе
Нужна помощь. Написать программу: 1 класс. Имеется абстрактный класс который описывает какую-то сущность, например Человек. В абстрактном...

23
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
09.05.2015, 16:59
Студворк — интернет-сервис помощи студентам
Doublench, если речь про вот эти методы в RBtree
C++
1
2
3
4
  Iterator *find(void *elem, size_t size); // ???
  Iterator *newIterator();                 // ???
  Iterator *begin();                       // ???
  Iterator *end();                         // ???
То тут возвращается именно RBtree::Iterator *, т.е. указатель на неабстрактный итератор.
Не смотря на то, что в базовых классах возвращается Container::Iterator *.
Это возможно потому, что указатель наследника приводим к указателю на базовый класс, а возвращаемое значение, в свою очередь, не участвует в разрешении перегрузки. Возможность смены типа возвращаемого значения в виртуальных функциях определяется ковариантностью этих типов.
Ковариантность определяется стандартом в (10.3/7):
the return types of the functions are covariant if they satisfy the following criteria:
(7.1) — both are pointers to classes, both are lvalue references to classes, or both are rvalue references to
classes112
(7.2) — the class in the return type of B::f is the same class as the class in the return type of D::f, or is an
unambiguous and accessible direct or indirect base class of the class in the return type of D::f

(7.3) — both pointers or references have the same cv-qualification and the class type in the return type of D::f
has the same cv-qualification as or less cv-qualification than the class type in the return type of B::f.
Наш случай выделил.
0
1 / 1 / 0
Регистрация: 05.07.2013
Сообщений: 176
09.05.2015, 19:57  [ТС]
DrOffset, ага, прояняется. А что делать с аргументами функций ? Созданный не абстрактный преобразуем в абстрактный по иерархии выше и передать. После получения преобразуем по иерархии ниже и уже работаем с ним. Я верно понял ?
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
09.05.2015, 20:23
Цитата Сообщение от Doublench Посмотреть сообщение
Созданный не абстрактный преобразуем в абстрактный по иерархии выше и передать. После получения преобразуем по иерархии ниже и уже работаем с ним. Я верно понял ?
Нет.
Абстрактный класс - выступает в роли интерфейса. Если ты внутри функции не можешь работать с ним, через его абстрактный интерфейс (без всяких преобразований к наследнику), то у тебя что-то не так в архитектуре.
1
1 / 1 / 0
Регистрация: 05.07.2013
Сообщений: 176
11.05.2015, 14:50  [ТС]
DrOffset, один метод реализовал. Остается лишь одно, преобразование и лучше вниз по иерархии.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.05.2015, 14:50

Создать абстрактный базовый класс Тройка чисел с виртуальными методами увеличения на 1. Создать производный класс Время со своими функциями
Здравствуйте, пожалуйста помогите написать код к данной задаче, с таким условием: Создать абстрактный базовый класс Тройка чисел с...

Написать обработчик исключений ситуации при преобразовании указателя на класс B до указателя на абстрактный класс А ...
Написать обработчик исключений ситуации при преобразовании указателя на класс B до указателя на абстрактный класс А ... как сделать...

Абстрактный класс/Класс интерфейс
Не ловлю суть в чем разница между интерфейсом и абстрактным классом. И там и там у методов нету реализации. Ну интерфейс задает набор...

Создать класс - данные - абстрактный базовый класс. Создать производные классы
Всем привет! У меня вот такая проблема.... Создать класс - данные - абстрактный базовый класс. Создать производные классы - данные типа...

Абстрактный класс
Есть такое задание: Сгенерируйте абстрактный класс типа фигура, создайте производные от него классы типа пятиугольник, прямоугольник. В...


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

Или воспользуйтесь поиском по форуму:
24
Ответ Создать тему
Новые блоги и статьи
После закрытия оутлука продолжает висеть процесс в диспетчере задач
Maks 27.10.2026
С недавнего времени в продакшене возникла проблема: при закрытии оутлука в диспетчере задач продолжал висеть процесс outlook. exe. Проблема возникла после установки MS Office 2021 LTSC на машинах, под. . .
Baragoz - DPS/HPS бот для WoW 3.3.5a, многоязычный
AmbA 26.10.2026
Хотите ещё ботов? У меня есть один! А я пока отдохну от него. https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=12062&stc=1&d=1793007952 Инструкция внутри. https:/ / youtu. be/ VpfFZSUDGnQ. . .
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности. Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru