Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.08.2018, 20:58   #1
imPDA
Новичок
Джуниор
 
Регистрация: 08.08.2018
Сообщений: 2
По умолчанию Шаблоны и наследники

Добрый день! Изучаю C++ на уровне хобби, захотел написать программу с динамическими списками, причем списков этих может быть много, и они разные. Информация, хранимая в списке, оформлена в структуру. Допустим, так
Код:
struct st1
{
int id, pin;
char *name;
st1 *next;
};

struct st2
{int id, time;
st2 *next;
};
Затем я создал два набора функций, по одной на список, как было указано на сайте: http://www.codenet.ru/progr/cpp/dlist.php

Что-то типа такого:

Код:
void constr(st1 l);  
bool chkEmpty(st1 l);    
void add(st1 l, id, pin, name);         
void change(st1 l, id, pin, name);      
st1 *search(st1 l, id);        
st1 *getPtrToHead(st1 l); 
void delete(st1 l, id);
И, естественно, два набора, для st1 и st2. А потом я подумал, что если мне нудно будет создать еще пару списков, то это же каждый раз переписывать функции. Допустим, их можно перегрузить, но не все и не всегда. Поэтому и созрел вопрос: можно ли использовать в этом случае шаблоны классов? Допустим, функции для создания списка и для проверки пустоты ничем не отличаются для всех списков, как впрочем и удаление. Сделаем так:

Код:
template <class T>
class List
{
  public:
    List()
    {
    }

    virtual ~List()
    {
    }

  protected:
    void constr(T &);       
    bool chkEmpty(T);           
    T *GetPtrToHead(T);         
    void delete(T &);           
    virtual T *search(T) = 0;   
    virtual void add(T &) = 0; 
};
Можно ли как-то указать наследников этого класса, чтобы функции "поняли" с какой структурой они работают?

Код:
class sub1 : public List<st1>
{
//some stuff here, i have no idea what i should do, unfortunatelly
};

class sub2 : public List<st2>
{
//some stuff here, i have no idea what i should do, unfortunatelly
//some stuff here, i have no idea what i should do, unfortunatelly
};
imPDA вне форума Ответить с цитированием
Старый 08.08.2018, 21:57   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от imPDA Посмотреть сообщение
можно ли использовать в этом случае шаблоны классов?
Можно.
Цитата:
Сообщение от imPDA Посмотреть сообщение
Можно ли как-то указать наследников этого класса, чтобы функции "поняли" с какой структурой они работают?
Не понятно зачем это надо... Функции тоже могут быть шаблонными.
waleri вне форума Ответить с цитированием
Старый 09.08.2018, 16:48   #3
imPDA
Новичок
Джуниор
 
Регистрация: 08.08.2018
Сообщений: 2
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Не понятно зачем это надо...
Чтобы защитить хранящиеся переменные, инкапсулировать. Обращаться с ними будет приятнее. Из программы будет не важно, как что реализовано, а есть просто набор методов.

Можно обойтись и без шаблонов, переопределить функции в каждом подклассе. Просто это была попытка сделать универсальное устройство, чтобы при минимуме изменений в коде добавить работу с еще одним списком.

Параллельно я читаю информацию о реализации принципов ООП в C# и там на классах можно сделать действительно крутые вещи.
imPDA вне форума Ответить с цитированием
Старый 09.08.2018, 16:56   #4
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Зачем вам писать новый класс для каждого списка?
Сделайте данные отдельно от указателей и т.п., тогда хватит одного List<T>

Смотрите на стандартные контейнеры https://en.cppreference.com/w/cpp/container/list
Цитата:
Сообщение от imPDA Посмотреть сообщение
функции для создания списка и для проверки пустоты ничем не отличаются для всех списков, как впрочем и удаление
все остальные тоже.
Для сравнения в поиске есть же ==
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 09.08.2018 в 17:04.
Alex11223 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Виртуальный метод и классы наследники. Вопросы Booma C# (си шарп) 5 10.11.2017 12:14
Шаблоны в программировании VS Шаблоны в реальной жизни Alar Свободное общение 11 05.11.2014 10:24
Абстрактный класс и его наследники Bumble bee Помощь студентам 1 18.05.2012 10:14
Потоки - Как сделать чтоб не предок ждал пока наследники подсчитают, а один наследник ждал другого? SkrudjMakdak Общие вопросы Delphi 7 22.09.2010 09:03
Шаблоны С++ Secc Помощь студентам 4 27.12.2009 17:35