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

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

Войти
Регистрация
Восстановить пароль
 
dovskr
0 / 0 / 0
Регистрация: 13.03.2013
Сообщений: 18
#1

Указатели в базовом классе на базовый класс и производный класс - C++

27.04.2013, 14:59. Просмотров 757. Ответов 7
Метки нет (Все метки)

Пишу контейнер "Бинарное дерево поиска" для частотного словаря.

С самим контейнером особо вопросов нету. Вопрос по поводу элементов в нём.

Я создал базовую структуру, описывающую элемент обычного бинарного дерева.






C++
1
2
3
4
5
6
7
8
9
10
11
12
template <typename T>
struct CTreeElement
{
public:
    CTreeElement *Left;    // Указатель на левого сына данного узла
    CTreeElement *Right;  // Указатель на правого сына данного узла
protected:
    T Data;
public:
    CTreeElement(const T &Element): Data(Element), Left(nullptr), Right(nullptr) {};
    const T &GetData() const {return Data;};
};

Дальше я хочу создать структуру, описывающую элемент бинарного дерева поиска для частотного словаря( Эта структура должна наследовать верхнюю и добавляеть ещё int Count - количество раз, которое встретилось данное слово).

Всё бы хорошо, но возникает проблема. Мне надо чтобы теперь указатели Left и Right были типа производного класса а не базового. Всё что придумал на данный момент это просто переопределять переменные, но это совсем не тру.

C++
1
2
3
4
5
6
7
8
9
10
template <typename T>
struct CSearchTreeElement : public CTreeElement<T>
{
public:
    CSearchTreeElement *Left;
    CSearchTreeElement *Right;
    int Count;
public: 
    CSearchTreeElement(const T &Element) : Count(1), Left(nullptr), Right(nullptr), CTreeElement(Element) {};
};


Пробовал делать виртуальные функции GetLeft и GetRight в базовом классе которые возвращают эти указатели, но потом понял что переопределить их не получится в производном классе, так как они там уже должны будут возвращать указатели типа CSearchTreeElement.

Собственно есть какое-то решение некостыльное? Может есть какой-нибудь паттерн для этого?

Добавлено через 19 часов 37 минут
Ап.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.04.2013, 14:59
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Указатели в базовом классе на базовый класс и производный класс (C++):

базовый и производный класс, в базовом объявлена переменная "protected", она недоступна по имени в производном классе! template <class T> воду мутит! - C++
Друзья! Вот код #include &lt;stdio.h&gt; template &lt;class T&gt; class otets { protected: int peremennaya; }; template &lt;class...

Есть базовый и производный класс, в базовом определена функция, необходимо её объявить в производном! - C++
Как-то так, что ли: class x { public: void f_0 (){}; }; class y: public x { public: //Тут у меня пойдёт...

Создать базовый класс - Array и производный класс - Money для работы денежной суммы - C++
ПОМОГИТЕ, ПОЖАЛУЙСТА, С ЗАДАЧЕЙ Создать базовый класс - Array и производный класс - Money для работы денежной суммы

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

Наследование: базовый класс Квадрат, производный класс Пирамида - C++
Помогите, пожалуйста!:cry: Добавлено через 6 минут Создать класс КВАДРАТ, член класса- длинна стороны. Предусмотреть в классе методы...

Создать базовый класс Triad и производный класс vector3D - C++
Помогите пожалуйста с заданием. Часть кода(vector3D) сделал, вроде работает Нужно помочь с классом Triad. Вот полное задание: ...

7
Jupiter
Каратель
Эксперт С++
6566 / 3987 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
27.04.2013, 15:04 #2
Curiously recurring template pattern
0
dovskr
0 / 0 / 0
Регистрация: 13.03.2013
Сообщений: 18
27.04.2013, 16:41  [ТС] #3
Собственно я взял скорее идею из этого паттерна, но как его в моём конкретном случае реализовать полностью неясно.
Вот новая версия этих классов:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
template <typename T, typename TypeOfTreeElement>
struct CTreeElement
{
public:
    TypeOfTreeElement *Left;
    TypeOfTreeElement *Right;
protected:
    T Data;
public:
    CTreeElement(const T &Element): Data(Element), Left(nullptr), Right(nullptr) {};
    const T &GetData() const {return Data;};
};
 
 
template <typename T>
struct CSearchTreeElement : public CTreeElement<T, CSearchTreeElement<T>>
{
public:
    int Count;
public: 
    CSearchTreeElement(const T &Element) : Count(1), CTreeElement(Element) {};
};


Теперь возникает другая проблема. Когда пользователь будет использовать класс CSearchTreeElement, то тут особых проблем не будет. Но если он будет создавать объект класса CTreeElement, то он обязательно должен будет написать что-то типо
C++
1
CTreeElement<int, CTreeElement<int>>
То есть если пользователь напишет
C++
1
CTreeElement<int, int> A;
то будет очень плохо.
Я так полагаю и от этого можно избавится?
0
Jupiter
Каратель
Эксперт С++
6566 / 3987 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
27.04.2013, 16:54 #4
Цитата Сообщение от dovskr Посмотреть сообщение
Когда пользователь будет использовать класс CSearchTreeElement
имхо, пользователь вообще не должен знать что есть такие классы как CSearchTreeElement и CTreeElement
0
dovskr
0 / 0 / 0
Регистрация: 13.03.2013
Сообщений: 18
27.04.2013, 16:56  [ТС] #5
Почитав про тот паттерн я это понял, только не понял как это реализовать в моём конкретном случае.
Просто создать абстрактный базовый шаблонный(с одним параметром типа T) класс для этих двух не получается.
0
Jupiter
Каратель
Эксперт С++
6566 / 3987 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
27.04.2013, 17:03 #6
Цитата Сообщение от dovskr Посмотреть сообщение
Дальше я хочу создать структуру, описывающую элемент бинарного дерева поиска для частотного словаря( Эта структура должна наследовать верхнюю и добавляеть ещё int Count - количество раз, которое встретилось данное слово).
dovskr, я вообще не вижу тут повода для наследования, можно обойтись одним CTreeElement в который параметром шаблона передавать свою структуру типа
C++
1
2
3
4
5
struct DictionaryItem
{
    std::string word;
    int count;
};
0
OhMyGodSoLong
27.04.2013, 17:03
  #7

Не по теме:

А чем плох вариант в словосочетании "дерево поиска для частотного словаря" отделить "дерево" и "частотный словарь"? Вынести всю эту шушеру с Count в тип T, что она забыла в обобщённом дереве?

0
dovskr
0 / 0 / 0
Регистрация: 13.03.2013
Сообщений: 18
27.04.2013, 17:12  [ТС] #8
Jupiter, Да, пожалуй действительно так и надо, а то я уже заколебался с этим наследованием тут. Никак его не получается нормально оформить.
0
27.04.2013, 17:12
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.04.2013, 17:12
Привет! Вот еще темы с ответами:

Создать базовый класс Тройка_чисел (Triad) и производный класс Time с полями часы, минуты и секунды - C++
Наследование. Виртуальныефункции.Полиморфизм. 1. Цельзадания: 1) Создание консольного приложения, состоящего и - Базовый класс:...

Базовый класс Student и производный класс Aspirant - C++
Задача была такова: Создайте класс Student, который будет содержать информацию о студенте. С помощью механизма наследования,...

Базовый класс Liquid и производный класс Alcohol - C++
Создать класс Liquid, имеющий поля названия и плотности. Определить методы переназначения и плотности. Создать производный класс Alcohol,...

Базовый класс Complex и производный класс Vector - C++
Создайте базовый класс Complex (комплексное число) для реализации комплексных чисел в алгебраической форме и основных операций с ними:...


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

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

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