Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
18 / 17 / 7
Регистрация: 16.05.2017
Сообщений: 390
1

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

01.02.2019, 10:09. Просмотров 914. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.02.2019, 10:09
Ответы с готовыми решениями:

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

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

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

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

8
56 / 41 / 15
Регистрация: 06.03.2018
Сообщений: 178
01.02.2019, 10:34 2
Насколько я понимаю у Вас такого типа как ConcreteConverter вообще не объявлено. Есть ConcreteConverter<T>, а это совсем другое.
Может class ConcreteConverter наследовать от какого нибудь базового класса который мог бы хранить в себе информацию о типе наследуемого класса? И возвращать именно его. А уже потом приводить к тому или иному типу...
0
213 / 138 / 26
Регистрация: 11.01.2019
Сообщений: 571
01.02.2019, 12:10 3
Фабрика тоже должна быть шаблоном.
0
56 / 41 / 15
Регистрация: 06.03.2018
Сообщений: 178
01.02.2019, 14:33 4
Цитата Сообщение от BaredJJ Посмотреть сообщение
Код не компилируется, так как в фабрике возвращаемое значение не типизировано.
Цитата Сообщение от BaredJJ Посмотреть сообщение
C++
1
GetConverter(int index) { switch (index) { case '1':
Вас здесь ничего не смущает?
0
18 / 17 / 7
Регистрация: 16.05.2017
Сообщений: 390
01.02.2019, 14:44  [ТС] 5
Зачем тогда фабрика в данном случае, если она будет шаблоном. Я и хотел, чтобы она возвращала конкретную реализацию. Вариант с наследованием от базового будет черезмерно раздувать код.

Добавлено через 1 минуту
Цитата Сообщение от galeks1 Посмотреть сообщение
Вас здесь ничего не смущает?
Согласен сравнивать нужно не char
0
458 / 249 / 55
Регистрация: 17.05.2015
Сообщений: 786
01.02.2019, 14:55 6
Цитата Сообщение от 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
18 / 17 / 7
Регистрация: 16.05.2017
Сообщений: 390
01.02.2019, 19:23  [ТС] 7
Я конечно не силен в синтаксисе 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
12679 / 6891 / 1658
Регистрация: 30.01.2014
Сообщений: 11,510
01.02.2019, 20:56 8
Цитата Сообщение от BaredJJ Посмотреть сообщение
Вуа ля)
Но сделали вы в итоге именно так, как сначала критиковали:
Цитата Сообщение от BaredJJ Посмотреть сообщение
Вариант с наследованием от базового будет черезмерно раздувать код.
1
18 / 17 / 7
Регистрация: 16.05.2017
Сообщений: 390
01.02.2019, 21:04  [ТС] 9
Видно я не до понял сначала)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.02.2019, 21:04

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

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