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

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

Восстановить пароль Регистрация
 
dovskr
0 / 0 / 0
Регистрация: 13.03.2013
Сообщений: 18
27.04.2013, 14:59     Указатели в базовом классе на базовый класс и производный класс #1
Пишу контейнер "Бинарное дерево поиска" для частотного словаря.

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

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






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++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 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++
6543 / 3963 / 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++
6543 / 3963 / 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++ typeid определяет тип указателя на базовый класс, как тип "базовый класс". Вне зависимости от присвоенного ему значения
C++ Указатель на базовый класс и на производный
C++ Разработать производный от абстрактного класса Figure класс и класс, производный от производного

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

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

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