Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 17.09.2021
Сообщений: 8

Работа с шаблонными классами

17.09.2021, 10:59. Показов 1018. Ответов 10
Метки с++ (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!
Суть задачи в следующем: имеется абстрактный класс (IData), полем которого является двумерный шаблонный класс вектор (Vtr), также есть некоторый класс SomeData унаследованный от IData. (IData не шаблонный класс). Не могу получить доступ к элементам вектор следующим образом:
template <typename T> T & operator () (int, int) const; //обращение к конкретному параметру

каким образом можно решить подобную задачу?
Реализация класса IData как класса шаблонного класса не уместно, в рамках данной проекта.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
class IData
{
public:
    enum TypeData{
        int8,
        int16,
        int32,
        int64,
        uint8,
        uint16,
        uint32,
        uint64,
        float32, //float
        float64, //double
        float80, //long double
    };
    class AbstractData {
    public:
        int length = 0;
        int params = 0;
        virtual ~AbstractData(){};
        virtual void init() = 0;
        virtual void destroy() = 0;
    };
    template <class T>
    class Data: public AbstractData {
    public:
        Vtr<T> **data = nullptr;
        Vtr<T> *packet  = nullptr;
 
        Data (int prms, int len){
            this->params = prms;
            this->length = len;
            init();
        };
        void init() override;
        void destroy() override;
    };
private:
    template <typename T> T& getDataCoord(int, int);
    template <typename T> Vtr<T>& getPacket(int);
protected:
    TypeData type;
    AbstractData *data = nullptr;
    std::string* name_param = nullptr; // наименования параметров
    virtual void init_name_param() = 0;
 
    void init(TypeData t, int params, int length);
    void destroy(); 
public:
    virtual ~IData(){};
    int countParam() {return data->params; }  // количество параметров
    int size() const {return data->length;}; //общее количество данных
 
    template <typename T>
    Vtr<T>& operator () (int) const; //получение столбца данных (срез-packet)
 
    template <typename T>
    T & operator () (int, int) const; //обращение к конкретному параметру
 
    template <typename T>
    Vtr<T>& end() const; //- //последний столбец данных
 
    template <typename T>
    Mtx<T>& getData() const; // выдача данных 
 
    template <typename T>
    Vtr<T>& param(const int) const; // обращение к параметру(очень долгая операция)
 
    template <typename T>
    Mtx<T>& getData(int, int) const; // получение данных в диапазоне (старт - стоп) 
 
    std::string getNameParam(const int indx);
 
    template <typename T>
    void setVtr(const int indx_pack, Vtr<T> &v);
};
 
template<class type>
class Vtr{
private:
    type* ets = nullptr;       // entries of the vector
    int length; // number of entries
public:
    Vtr(int, type *);         // constructor
    Vtr(int = 0, type d = 0); //all enties equal d
    Vtr(const Vtr&);             //copy constructor
    ~Vtr();
    int size() const {return length;}  //return length
    Vtr& operator = (const Vtr&); // exception
    Vtr& operator += (const Vtr&);     //v+=v2
    Vtr& operator -= (const Vtr&);     //v-=v2
    Vtr& operator << (const Vtr&); // joinBottom
    type maxnorm(); 
    double twonorm();
    double std(); 
    double mean();  
    Vtr abs();
    type max();
    type min();
    type sum();
    type& operator () (int i) const;
    Vtr operator () (int, int); // select range //скорее всего не нужная операция
    template <typename type_transition> explicit operator Vtr<type_transition> () {
        Vtr<type_transition> res(this->length);
        for (int i = 0; i< length; i++)
            res(i) = static_cast <type_transition> (ets[i]);
        return res;
    }
    template<class V> friend Vtr<V> operator + (const Vtr<V>& v);
    template<class V> friend Vtr<V> operator - (const Vtr<V>&);
    template<class V> friend Vtr<V> operator + (const Vtr<V>&, const Vtr<V>&);
    template<class V> friend Vtr<V> operator - (const Vtr<V>&, const Vtr<V>&);
    template<class V, typename TScalar> friend Vtr<V> operator - (const Vtr<V>&, const TScalar);
    template<class V, typename TScalar> friend Vtr<V> operator + (const Vtr<V>&, const TScalar);
    template<class V, typename TScalar> friend Vtr<V> operator*(TScalar,const Vtr<V>&); 
    template<class V, typename TScalar> friend Vtr<V> operator*(const Vtr<V>&, TScalar); 
    template<class V, typename TScalar> friend Vtr<V> operator / (const Vtr<V>&, TScalar);
    template<class V> friend Vtr<V> operator * (const Vtr<V>&, const Vtr<V>&);
    template<class V> friend V dot(const Vtr<V>&, const Vtr<V>&);
    void push_back(const type);
    void print();
};
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.09.2021, 10:59
Ответы с готовыми решениями:

Непонятки с шаблонными классами и typedef
у меня есть шаблонный класс чисел с фиксированной запятой &quot;unfloat&lt;Point_Offset&gt;&quot;, в качестве параметра этот шаблон берет положение...

Работа с классами
Привет всем!!!!! Пацаны помогите написать программу плиз, на завтро нужно!!!!! Тема: Классы Задание:Описати інтерфейс та реалізувати...

Работа с классами
Помогите с задачей, пожалуйста! Условие на фотографии: Перепечатывайте задание на форум.

10
фрилансер
 Аватар для Алексей1153
6467 / 5682 / 1131
Регистрация: 11.10.2019
Сообщений: 15,144
17.09.2021, 11:04
Цитата Сообщение от Fdr15 Посмотреть сообщение
T & operator () (int, int) const
если метод константный, то вряд ли получится вернуть не константную ссылку на элемент

а где сам код то ?
0
0 / 0 / 0
Регистрация: 17.09.2021
Сообщений: 8
17.09.2021, 11:19  [ТС]
хотелось бы что бы клиентский код был организован в таком духе

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int main(){
    int count_block = 2;
    int len_block = 1;
    Vtr<short> packet(13, 2);
    SomeData data (count_block * len_block);
    packet.print();
    data.setVtr(0, packet);
 
    short some_num = data(0,0); // данное обращение к оператору не возможно
 
    std::cout<<some_num << std::endl;
 
    return 0;
}
Добавлено через 2 минуты
вас интересует реализация методов?
0
фрилансер
 Аватар для Алексей1153
6467 / 5682 / 1131
Регистрация: 11.10.2019
Сообщений: 15,144
17.09.2021, 11:21
Цитата Сообщение от Fdr15 Посмотреть сообщение
реализация методов
полный код шаблона + пример неработающего использования

это не меня интересует, это должно было быть в вопросе
0
0 / 0 / 0
Регистрация: 17.09.2021
Сообщений: 8
17.09.2021, 11:45  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
template <typename T>
T& IData::getDataCoord(int pack, int param){
    switch (type) {
    case int8: return static_cast<int8_t>((*dynamic_cast<Data<int8_t>*>(data)->data[param])(pack));
    case int16: return static_cast<int16_t>((*dynamic_cast<Data<int16_t>*>(data)->data[param])(pack));
    case int32: return static_cast<int32_t>((*dynamic_cast<Data<int32_t>*>(data)->data[param])(pack));
    case int64: return static_cast<int64_t>((*dynamic_cast<Data<int16_t>*>(data)->data[param])(pack));
 
    case uint8: return static_cast<uint8_t>((*dynamic_cast<Data<uint8_t>*>(data)->data[param])(pack));
    case uint16: return static_cast<uint16_t>((*dynamic_cast<Data<uint16_t>*>(data)->data[param])(pack));
    case uint32: return static_cast<uint32_t>((*dynamic_cast<Data<uint32_t>*>(data)->data[param])(pack));
    case uint64: return static_cast<uint64_t>((*dynamic_cast<Data<uint64_t>*>(data)->data[param])(pack));
 
    case float32: return static_cast<float>((*dynamic_cast<Data<float>*>(data)->data[param])(pack));
    case float64: return static_cast<double>((*dynamic_cast<Data<double>*>(data)->data[param])(pack));
    case float80: return static_cast<long double>((*dynamic_cast<Data<long double>*>(data)->data[param])(pack));
    }
}
 
template<class T>
T& IData::operator()(int pack, int param) const
{
    try {
        if (!data)
            throw ErrorData::CalledNotExisData;
        if (!((data->length > pack) && (pack >= 0) &&
             (data->params > param) && (param >= 0)))
            throw ErrorData::OutOfSizeData;
        return getDataCoord<T>(pack, param);
    }
    catch (ErrorData code) {
        throw error_code(code);
    }
    catch (error_code code) {
        throw code;
    }
    catch (...){
        throw error_code(ErrorData::UnknowError);
    }
}
 
main.cpp
 
#include "frames/TypeData.h"
 
int main()
{
    int count_block = 2;
    int len_block = 1;
    Vtr<short> packet(13, 2);
    SomeData data (count_block * len_block);
    packet.print();
    data.setVtr(0, packet);
    short num = data(0, 0); // ошибка "no matching function for call to object of type SomeData" 
    return 0;
}
0
фрилансер
 Аватар для Алексей1153
6467 / 5682 / 1131
Регистрация: 11.10.2019
Сообщений: 15,144
17.09.2021, 11:55
Fdr15, код в посте №5 не компилируется Он не полный

по поводу оператора - должен возвращаться тип T&, но при этом ничего не возвращается

Добавлено через 4 минуты
Цитата Сообщение от Fdr15 Посмотреть сообщение
Vtr<T> **data = nullptr;
Vtr<T> *packet = nullptr;
класс Vtr используется без объявления, это тоже ошибка
0
0 / 0 / 0
Регистрация: 17.09.2021
Сообщений: 8
17.09.2021, 11:55  [ТС]
Вот тестовый проект
Вложения
Тип файла: zip testframes v.0.2.zip (24.3 Кб, 3 просмотров)
0
фрилансер
 Аватар для Алексей1153
6467 / 5682 / 1131
Регистрация: 11.10.2019
Сообщений: 15,144
17.09.2021, 12:02
Fdr15, для начала: разбивать шаблон по разным файлам (h,cpp,inl (? о_о) ) не получится. Используй для каждого шаблона свой отдельный h-файл, без разбивки.

Результат прицепи снова
0
0 / 0 / 0
Регистрация: 17.09.2021
Сообщений: 8
17.09.2021, 12:20  [ТС]
если закомментировать строку с обращение к оператору template <typename> (int, int) T & operator () (int, int) const; то в принципе проект собирается

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include "frames/TypeData.h"
 
int main()
{
    int count_block = 2;
    int len_block = 1;
    Vtr<short> packet(13, 2);
    SomeData data (count_block * len_block);
    packet.print();
    data.setVtr(0, packet);
    //short num = data(0, 0);
    return 0;
}
Добавлено через 11 минут
Задача из той же области
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class SomeClass{
public:
    template <typename T>
    T operator()(int){
        T res = 0;
        return res;
    }
    template<typename T>
    T operator ()(T, int){
        T res = 0;
        return res;
    }
};
 
int main()
{
    SomeClass some;
    int a = some(0.1, 0); // ок
    int b = some(0); // ошибка "no matching function for call to object of type 'SomeClass'
    return 0;
}
0
0 / 0 / 0
Регистрация: 17.09.2021
Сообщений: 8
17.09.2021, 12:59  [ТС]
Сделал как вы и сказали
Вложения
Тип файла: zip testframes v.0.3.zip (18.3 Кб, 4 просмотров)
0
фрилансер
 Аватар для Алексей1153
6467 / 5682 / 1131
Регистрация: 11.10.2019
Сообщений: 15,144
17.09.2021, 13:37
Fdr15,

1) файл frames/MetaData.cpp из pro не убран

2) Vtr<T> *packet = nullptr; packet - это указатель на Vtr<T>. А тут

template <typename T> Vtr<T>& getPacket(int pack){
...
...
return &static_cast<T>(p_data->packet);
это как вдруг Vtr<T>* пытаешься кастить к T ?
и от этого всего чуда ещё и берёшь адрес, который к тому же хочешь вернуть как Vtr<T>&


3) short num = data(0, 0); //

оператор принимает один аргумент, а не два
Vtr<T>& operator () (int indx)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.09.2021, 13:37
Помогаю со студенческими работами здесь

Работа с классами
плиз помогите решить нужно написать функции которыи будут выполнять сложение, вычитание, умножение и деление допустим d1 и d3 вот то...

Работа с классами
Здравствуйте! Вот у меня есть класс Team team.h#pragma once #include &lt;string&gt; using namespace std; class Team{ public: ...

работа с классами
помогите пожалуйста написать программу на C++: Создать класс Complex для работы с комплексными числами,который должен содержать два...

Работа с классами
Не знаю как правильно задать вопрос, поэтому приведу пример. У меня есть класс матрица как лучше реализовать операцию сложения матриц? Я...

Работа с классами
Здравствуйте. Есть код, компиляция происходит нормально, Dev-C++ не выдаёт никаких ошибок. Но когда запускаю программу и начиная там...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Видеокарта простаивает ночами? Вот 4 проекта, которые загрузят её наукой
Programma_Boinc 10.04.2026
Видеокарта простаивает ночами? Вот 4 проекта, которые загрузят её наукой Если на Windows стоит дискретная NVIDIA или AMD — можно отдать её вычислительную мощность реальным исследованиям. . . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru