Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
 Аватар для BaredJJ
19 / 18 / 7
Регистрация: 16.05.2017
Сообщений: 447

Использование фабрики для шаблонного класса

01.02.2019, 10:09. Показов 1833. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вот класс
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
template <class T>
class ConcreteConverter
{
    T _value;
    long long _maxValue;
    long long _minValue;
public:
    ConcreteConverter(long long maxValue, long long minValue)
    {
        _maxValue = maxValue;
        _minValue = minValue;
    }
 
 
};
Вот фабрика
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
class ConverterFactory
{
public:
    ConcreteConverter GetConverter(int index);
};
 
ConcreteConverter GetConverter(int index)
{
    switch (index)
    {
    case '1':
        {
            ConcreteConverter<bool> boolConverter(2, 0);
            return boolConverter;
        }
    case '2':
        {
        ConcreteConverter<char> charConverter(CHAR_MAX, CHAR_MIN);
        return charConverter;
        }
    case'3':
        {
        ConcreteConverter<short> shortConverter(SHRT_MAX, SHRT_MIN);
        return shortConverter;
        }
    case'4':
        {
        ConcreteConverter<int> intConverter(INT_MAX, INT_MIN);
        return intConverter;
        }
    case '5':
        {
        ConcreteConverter<long> longConverter(LONG_MAX, LONG_MIN);
        return longConverter;
        }
    default:
        {
        ConcreteConverter<long long> longLongConverter(9223372036854775807, -9223372036854775807);
        return longLongConverter;
        }
 
    }
}
Код не компилируется, так как в фабрике возвращаемое значение не типизировано. У меня и была такая задумка, чтобы типизация происходила внутри метода, а возвращался объект уже полностью настроенный и готовый к работе. Как это можно реализовать? Хотелось бы выделить отдельный класс для этого, так как его можно потом если что пробросить куда нибудь или использовать как общий для других.
Спасибо.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.02.2019, 10:09
Ответы с готовыми решениями:

Предусмотреть использование шаблонного класса для работы с различными типами данных
Собственно само задание. Преобразовать квадратную матрицу, осуществив поворот элементов вокруг центра матрицы на 90 градусов против...

Как корректно передать в метод шаблонного класса объект шаблонного класса в качестве параметра?
header.h template &lt;class T&gt; class MyVector { public: void swap(MyVector&lt;T&gt;Vector); } template &lt;class T&gt; void...

Создание шаблонного класса потомка и использование им родительских методов
Добрый день! По заданию нужно сделать класс с реализацией двусвязного списка, и некоторые методы добавить уже в классе потомке. ...

8
60 / 45 / 15
Регистрация: 06.03.2018
Сообщений: 202
01.02.2019, 10:34
Насколько я понимаю у Вас такого типа как ConcreteConverter вообще не объявлено. Есть ConcreteConverter<T>, а это совсем другое.
Может class ConcreteConverter наследовать от какого нибудь базового класса который мог бы хранить в себе информацию о типе наследуемого класса? И возвращать именно его. А уже потом приводить к тому или иному типу...
0
611 / 416 / 151
Регистрация: 11.01.2019
Сообщений: 1,746
01.02.2019, 12:10
Фабрика тоже должна быть шаблоном.
0
60 / 45 / 15
Регистрация: 06.03.2018
Сообщений: 202
01.02.2019, 14:33
Цитата Сообщение от BaredJJ Посмотреть сообщение
Код не компилируется, так как в фабрике возвращаемое значение не типизировано.
Цитата Сообщение от BaredJJ Посмотреть сообщение
C++
1
GetConverter(int index) { switch (index) { case '1':
Вас здесь ничего не смущает?
0
 Аватар для BaredJJ
19 / 18 / 7
Регистрация: 16.05.2017
Сообщений: 447
01.02.2019, 14:44  [ТС]
Зачем тогда фабрика в данном случае, если она будет шаблоном. Я и хотел, чтобы она возвращала конкретную реализацию. Вариант с наследованием от базового будет черезмерно раздувать код.

Добавлено через 1 минуту
Цитата Сообщение от galeks1 Посмотреть сообщение
Вас здесь ничего не смущает?
Согласен сравнивать нужно не char
0
 Аватар для eva2326
1673 / 501 / 107
Регистрация: 17.05.2015
Сообщений: 1,518
01.02.2019, 14:55
Цитата Сообщение от BaredJJ Посмотреть сообщение
это можно реализовать?
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
#include <iostream>
#include <cassert>
#include <climits>
#include <memory>
 
class IConverter
{
public:
    virtual ~IConverter(){}
    virtual int convert() = 0;
};
 
template <class T> 
class TConverter: public IConverter
{
    T _value;
    long long _maxValue;
    long long _minValue;
public:
    TConverter(long long maxValue, long long minValue)
        :_value()
        ,_maxValue(maxValue)
        ,_minValue(minValue)
    {}
    
    virtual int convert() override { return 0; }
};
 
class Converter
{
public:
    template<class T, class... Args>
    static Converter make(Args&&... args)
    {
        using Concrete = TConverter<T>;
        
        Converter cnv;
        cnv.m_converter = std::make_shared<Concrete>(
            std::forward<Args>(args)... 
        );
        return cnv;
    }
    int convert() 
    {
        assert(m_converter);
        return m_converter->convert();
    }
private:
    std::shared_ptr<IConverter> 
        m_converter = {};
};
 
Converter GetConverter(int index)
{
    switch (index)
    {
    case '1':
            return Converter::make<bool>(2, 0);
    case '2':
        return Converter::make<char>(CHAR_MAX, CHAR_MIN);
    case'3':
        return Converter::make<short>(SHRT_MAX, SHRT_MIN);
    case'4':
        return Converter::make<int>(INT_MAX, INT_MIN);
    case '5':
        return Converter::make<long>(LONG_MAX, LONG_MIN);
    default:
        return Converter::make<long long>(9223372036854775807, -9223372036854775807);
    }
}
 
int main()
{
    Converter cnv = GetConverter(1);
    std::cout << cnv.convert() << '\n';
}
1
 Аватар для BaredJJ
19 / 18 / 7
Регистрация: 16.05.2017
Сообщений: 447
01.02.2019, 19:23  [ТС]
Я конечно не силен в синтаксисе C++, но как я понял, то основная идея тут обернуть шаблон статическим методом, который возвращает конкретный экземпляр. Что мне не очень эта идея нравится, да и слишком сложновато получается для примера. Не в смысле для меня, а для того кому я это буду сдавать. ))) Поищу вариант по проще.

Добавлено через 1 час 16 минут
Сделал
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
template <class T>
class Converter:public IConverter
{
    T _value;
    long long _maxValue;
    long long _minValue;
public:
    Converter(long long maxValue, long long minValue)
    {
        _maxValue = maxValue;
        _minValue = minValue;
    }
 
    std::string Convert() override
    {
        return std::to_string(_maxValue);
    }
 
};
C++
1
2
3
4
5
class IConverter
{
public:
    virtual std::string Convert() = 0;
};
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
class ConverterFactory
{
public:
    IConverter* GetConverter(char index) const;
};
IConverter* ConverterFactory::GetConverter(char index) const
{
    switch (index)
    {
    case '1':
        {
            return new Converter<bool>(2,0);
        }
    case '2':
        {
        return new Converter<char>(CHAR_MAX, CHAR_MIN);
        }
    case '3':
        {
        return new Converter<short>(SHRT_MAX, SHRT_MIN);
        }
    case '4':
        {
        return new Converter<int>(INT_MAX, INT_MIN);
        }
    case '5':
        {
        return new Converter<long>(LONG_MAX, LONG_MIN);
        }
    default:
        {
        return new Converter<long long>(9223372036854775807, -9223372036854775807);
        }
 
    }
}
Вуа ля)
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
01.02.2019, 20:56
Цитата Сообщение от BaredJJ Посмотреть сообщение
Вуа ля)
Но сделали вы в итоге именно так, как сначала критиковали:
Цитата Сообщение от BaredJJ Посмотреть сообщение
Вариант с наследованием от базового будет черезмерно раздувать код.
1
 Аватар для BaredJJ
19 / 18 / 7
Регистрация: 16.05.2017
Сообщений: 447
01.02.2019, 21:04  [ТС]
Видно я не до понял сначала)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.02.2019, 21:04
Помогаю со студенческими работами здесь

Использование указателя на объект шаблонного класса в шаблонном классе.
Всем привет! Мне нужно реализовать граф. Начал с вершин и ребер, причем и ребра и вершины - шаблонные классы, для того чтобы и ребро и...

Друзья шаблонного класса. Использование вложенной в класс структуры
Всем привет! Изучаю книгу &quot;Прата С. - Язык программирования С++. Лекции и упражнения&quot;. Разобрал тему шаблоны классов и в...

Вызов метода у шаблонного поля, шаблонного класса
Пытаюсь разобраться с шаблонами- задача создать шаблонный класс, у которого есть шаблонное поле. и затем вызывать метод у этого поля. ...

Перегрузка << , >> для шаблонного класса
Доброго времени суток всем! Данная тема не раз подымалась на форуме.. Но есть но.. Помогите перегрузить операторы побитового сдвига для...

Итератор для шаблонного класса
Всем солнца! Честно честно честно пересмотрел более 100 различных вариантов разных решений. НО.... :wall: есть список: ...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru