Russian Qt Forum
Ноябрь 27, 2024, 23:03 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 2 3 [4]   Вниз
  Печать  
Автор Тема: Про templat  (Прочитано 20881 раз)
Ced
Гость
« Ответ #45 : Май 09, 2017, 13:48 »

Значит мне под каждый возможный тип определять отдельную виртуальную функцию?
Это если вы ходите сделать максимально плохо. 

А если не максимально?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #46 : Май 09, 2017, 13:58 »

А если не максимально?
Например так. Есть базовый класс ParametrBase, от него наследуются остальные четыре:
ParametrContinuous
ParametrDiscreteYesNo
ParametrTime
ParametrDateTime

У каждого класса будут свои специфичные данные и методы. У ParametrContinuous будут описаны минимумы и максимумы, которые не нужны для других типов, у  ParametrTime будут методы для хранения времени и т.д.

А в базовый класс стоит выносить только общие методы, например метод toString, который переопределяется в наследниках и правильно формирует значение параметра в строку для дальнейшего отображения.
 
Записан
Ced
Гость
« Ответ #47 : Май 09, 2017, 14:01 »

А если не максимально?
Например так. Есть базовый класс ParametrBase, от него наследуются остальные четыре:
ParametrContinuous
ParametrDiscreteYesNo
ParametrTime
ParametrDateTime

У каждого класса будут свои специфичные данные и методы. У ParametrContinuous будут описаны минимумы и максимумы, которые не нужны для других типов, у  ParametrTime будут методы для хранения времени и т.д.

А в базовый класс стоит выносить только общие методы, например метод toString, который переопределяется в наследниках и правильно формирует значение параметра в строку для дальнейшего отображения.
 

Тогда чего шаблон? Я бы под каждый тип данных определить класс и не ломать голову.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #48 : Май 09, 2017, 14:06 »

Тогда чего шаблон? Я бы под каждый тип данных определить класс и не ломать голову.
Вот тип параметра ParametrContinuous имело бы смысл сделать шаблоном, если в программе возможны разные типы параметров (целые/реальные).
Записан
Ced
Гость
« Ответ #49 : Май 09, 2017, 14:17 »

В итоге решил так:
Код:
template <typename T> class MyQueueBuffer
{
private:
    int  bufferLength;
    QQueue<MyData<T>> myQueueBuffer;
public:
    MyQueueBuffer<T> (const MyQueueBuffer <T>& toCopy);
    MyQueueBuffer<T> (int  length);

       T  dequeue();
    void  enqueue(const T &t);
};

template <typename T> MyQueueBuffer<T>::MyQueueBuffer (const MyQueueBuffer <T>& toCopy)
{
    bufferLength  = toCopy.bufferLength;
    myQueueBuffer = toCopy.myQueueBuffer;
}

template <typename T> MyQueueBuffer<T>::MyQueueBuffer (int  length)
{
    bufferLength = length;
}

class ParametrName
{
private:
        int  type;
        int  sorce;
      float  multiplier;
    QString  name;
    QString  discription;
    QString  dimension;

public:
    ParametrName (QTextStream &input);
    ParametrName (const ParametrName& toCopy);

//    virtual ~ParametrName();

        int  getType        ();
        int  getSorce       ();
      float  getMultiplier  ();
    QString  getDimension   ();
    QString  getName        ();
    QString  getDiscription ();

    void  setType        (    int  toSet);
    void  setSorce       (    int  toSet);
    void  setMultiplier  (  float  toSet);
    void  setDimension   (QString  toSet);
    void  setName        (QString  toSet);
    void  setDiscription (QString  toSet);

    virtual void  initBuffer (int  length);
};

template <typename T>class Parametr : public ParametrName
{
public:
    enum
    {
        continuous    = 0,
        discreteYesNo = 1,
        time          = 2,
        dateTime      = 3
    } parametrTypes;

    enum
    {
        measured           = 0,
        calculated         = 1,
        calculatedExternal = 2
    } parametrSource;

private:
                   T  minPossibleValue;
                   T  maxPossibleValue;
                   T  minMarginalValue;
                   T  maxMarginalValue;

    MyQueueBuffer<T> *buffer;
public:
    Parametr<T> (const Parametr <T>& toCopy);
    Parametr<T> (const ParametrName& toCopy);
    Parametr<T> (QTextStream &input, ParametrName const& toCopy);

       T  getMinPossibleValue ();
       T  getMaxPossibleValue ();
       T  getMinMarginalValue ();
       T  getMaxMarginalValue ();

    void  setMinPossibleValue (T  minToSet);
    void  setMaxPossibleValue (T  maxToSet);
    void  setMinMarginalValue (T  minToSet);
    void  setMaxMarginalValue (T  maxToSet);

    static MyQueueBuffer<T *> mainBufferData (int  number);

    void  initBuffer (int  length);
};

Проверил. Работает.
Записан
Ced
Гость
« Ответ #50 : Май 09, 2017, 14:21 »

И еще. Работа - работой, но всех с праздником Победы!
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #51 : Май 09, 2017, 14:45 »

Код:
        int  getType        ();
К слову: здесь (и в др геттерах) не хватает модификатора const

В итоге решил так:
Не понял что решилось Улыбающийся

Значит мне под каждый возможный тип определять отдельную виртуальную функцию?
Нет, так их просто нельзя будет затем использовать, т.к. виртуалы могут иметь только конкретные типы аргументов и возвращаемых значений. Виртуалы нужны чтобы рулить этой "оравой" разно-типных наследников. Напр пробегаться по контейнеру указателей на базовый тип и однообразно вызывать getMinPossibleValue, не влезая в утомительные разборки какой там тип конкретно.

И еще. Работа - работой, но всех с праздником Победы!
Да, спасибо, и Вас тоже. Хороший праздник!



Записан
Ced
Гость
« Ответ #52 : Май 09, 2017, 14:50 »

Цитировать
Не понял что решилось Улыбающийся


Да так и решилось. Наделал виртуалов и сделал функции, возвращающие сылки на массивы. содержащие шаблоны. А работать с этими ссылками буду в обработчиках. которые знают тип данных, с которым работают.
Записан
Ced
Гость
« Ответ #53 : Май 10, 2017, 21:33 »


[/quote]Ага, ну я так и знал, Вы совершенно напрасно связались с темплейтами, здесь прямо-таки напрашивается QVariant. Или др реализация variant, возможно даже на темплейтах но уже делающая много черновой работы которую сейчас Вам нужно реализовывать самому
[/quote]
Все, сдаюсь. Переделываю на QVariant. C этими шаблонами легче застрелиться.
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #54 : Май 11, 2017, 12:46 »

Все, сдаюсь. Переделываю на QVariant. C этими шаблонами легче застрелиться.

Стреляться из-за шаблонов не стоит. Надо лучше изучить их, хотя бы основы, и применять по назначению Улыбающийся.
Записан

Пока сам не сделаешь...
Ced
Гость
« Ответ #55 : Май 12, 2017, 15:21 »

Стреляться из-за шаблонов не стоит. Надо лучше изучить их, хотя бы основы, и применять по назначению Улыбающийся.

Вероятно с назначением я в этот раз промахнулся. Ну за то изучил основы:)
Записан
Страниц: 1 2 3 [4]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.222 секунд. Запросов: 23.