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

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

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

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

27.04.2013, 14:59. Просмотров 689. Ответов 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 минут
Ап.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.04.2013, 14:59     Указатели в базовом классе на базовый класс и производный класс
Посмотрите здесь:

Базовый класс и производный... C++
Есть производный класс и базовый; при чём производный использует только ЧАСТЬ ресурсов базового, правильно ли это? C++
C++ базовый и производный класс, в базовом объявлена переменная "protected", она недоступна по имени в производном классе! template <class T> воду мутит!
Есть базовый и производный класс, в базовом определена функция, необходимо её объявить в производном! C++
Создать базовый класс Points и производный от него Line C++
Разработать класс и производный класс C++
C++ Указатель на базовый класс и на производный
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6547 / 3967 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
27.04.2013, 15:04     Указатели в базовом классе на базовый класс и производный класс #2
Curiously recurring template pattern
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;
то будет очень плохо.
Я так полагаю и от этого можно избавится?
Jupiter
Каратель
Эксперт C++
6547 / 3967 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
27.04.2013, 16:54     Указатели в базовом классе на базовый класс и производный класс #4
Цитата Сообщение от dovskr Посмотреть сообщение
Когда пользователь будет использовать класс CSearchTreeElement
имхо, пользователь вообще не должен знать что есть такие классы как CSearchTreeElement и CTreeElement
dovskr
0 / 0 / 0
Регистрация: 13.03.2013
Сообщений: 18
27.04.2013, 16:56  [ТС]     Указатели в базовом классе на базовый класс и производный класс #5
Почитав про тот паттерн я это понял, только не понял как это реализовать в моём конкретном случае.
Просто создать абстрактный базовый шаблонный(с одним параметром типа T) класс для этих двух не получается.
Jupiter
Каратель
Эксперт C++
6547 / 3967 / 226
Регистрация: 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;
};
OhMyGodSoLong
27.04.2013, 17:03
  #7

Не по теме:

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

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.04.2013, 17:12     Указатели в базовом классе на базовый класс и производный класс
Еще ссылки по теме:

C++ Базовый класс цветы, производный тля, условие: тля уничтожает красные цветы
C++ Написать класс строка и производный класс, ее шифрующий
Как использовать вектор, содержащий указатели на класс, в этом же классе? C++
C++ Базовый класс Liquid и производный класс Alcohol
C++ Создать базовый и производный класс

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

Или воспользуйтесь поиском по форуму:
dovskr
0 / 0 / 0
Регистрация: 13.03.2013
Сообщений: 18
27.04.2013, 17:12  [ТС]     Указатели в базовом классе на базовый класс и производный класс #8
Jupiter, Да, пожалуй действительно так и надо, а то я уже заколебался с этим наследованием тут. Никак его не получается нормально оформить.
Yandex
Объявления
27.04.2013, 17:12     Указатели в базовом классе на базовый класс и производный класс
Ответ Создать тему
Опции темы

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