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

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

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

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

27.04.2013, 14:59. Просмотров 710. Ответов 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++
Как-то так, что ли: class x { public: void f_0 (){}; }; class y: public x { public: //Тут у меня пойдёт...

Наследование классов: почему производный класс не учитывает данные, введенные в базовом? - C++
Почему при компилляции производный класс не учитывает данные, введенные в базовом? #include &lt;iostream&gt; using namespace std; ...

Базовый класс и производный... - C++
Есть class A. У него есть функция protected foo(); Есть класс наследник B (class B: public A). В классе-наследнике B есть функция g(),...

Создать базовый и производный класс - C++
Базовый класс РАБОТНИК с член-данными ФИО, идентификационный код, возраст. Производный класс ИНЖЕНЕР с член-данными специальность, месячный...

Указатель на базовый класс и на производный - C++
Пытаюсь разобраться с классами и наследованием. Сама эта задача из Дейтела &quot;Как программировать на C++&quot; Есть базовый класс Точка и у...

Создать базовый класс Points и производный от него Line - C++
Создать базовый класс Points и производный от него Line. Создать динамический массив указателей на объекты класса Line и нарисовать их в...

Как использовать вектор, содержащий указатели на класс, в этом же классе? - C++
Возникла необходимость обращения к объекту класса внутри класса с помощью вектора, содержащего указатели на объекты этого класса. ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт С++
6552 / 3972 / 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
Каратель
Эксперт С++
6552 / 3972 / 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
Каратель
Эксперт С++
6552 / 3972 / 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++
Помогите пожалуйста!!! имеется класс Triangle выполняющий операции с треугольниками. Задание: нужно образовать производный класс...

Организовать производный класс - C++
Помогите пожалуйста!!! Организовать производный класс, наследующий все свойства базового и дополнительный методы нахождения скалярного...

Производный класс пирамида - C++
Здравствуйте! Мне надо сдать это задание, а я ни бум бум. Пожалуйста кто может помогите. Заранее благодарю. Задание...


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

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

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