Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
_stanislav
5 / 54 / 19
Регистрация: 16.08.2014
Сообщений: 383
Завершенные тесты: 2
#1

Объединить два похожих класса - C++

01.07.2015, 14:15. Просмотров 320. Ответов 6
Метки нет (Все метки)

Доброго времени суток. Есть два класса, полностью одинаковых в логике, различие только в том что один содержит один enum, второй другой. Как объединить эти два класса что бы уменьшить объем кода, склоняюсь к использованию шаблонов, только не знаю как.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Base { };
 
class A : public Base
{
public:
    enum EnumA { };
 
    //Методы...
};
 
class B : public Base
{
public:
    enum EnumB { };
 
    //Методы...
};
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
6248 / 5851 / 1891
Регистрация: 18.12.2011
Сообщений: 14,990
Завершенные тесты: 1
01.07.2015, 15:33     Объединить два похожих класса #2
Попробуйте так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
enum EnumA {valuea,... };
enum EnumB {valueb,... };
template<class T>
class A : public Base
{
public:
    T data;
    //Методы...
};
...
A<EnumA> a;
a.data=valuea;
A<EnumB> b;
b.data=valueb;
_stanislav
5 / 54 / 19
Регистрация: 16.08.2014
Сообщений: 383
Завершенные тесты: 2
01.07.2015, 18:27  [ТС]     Объединить два похожих класса #3
zss. Если использовать шаблоны, то класс Base автоматически становится шаблонным? И на него действуют все ограничения шаблонов? И еще вопрос, если использовать способ предложенный тобой, то как в нем организовать вот такой метод?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class A: public Base
{
public:
    enum Enum{ NONE, OTHER_1, OTHER_2 };
 
    void Set(Enum e)
    {
          if (e < NONE || e > OTHER_2) operationType = NONE;
          else operationType = e;
    }
 
private:
    Enum value;
};
Спасибо.
zss
Модератор
Эксперт С++
6248 / 5851 / 1891
Регистрация: 18.12.2011
Сообщений: 14,990
Завершенные тесты: 1
01.07.2015, 18:49     Объединить два похожих класса #4
Base Остается нешаблонным

Получится что-то типа
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
enum EnumA{ NONE, OTHER_1, OTHER_2 };
enum EnumB{ NONEB, OTHER_1B, OTHER_2B };
template<class T>
class A: public Base
{
public:
 
    void Set(T e)
    {
          if (e < (T)NONE || e > (T)OTHER_2) 
              operationType = (T)NONE;
          else 
             operationType = e;
    }
 
private:
    T operationType;
};
...
A<EnumA> a;
a.Set(OTHER_1);
A<EnumB> b;
b.Set(OTHER_2B);
_stanislav
5 / 54 / 19
Регистрация: 16.08.2014
Сообщений: 383
Завершенные тесты: 2
01.07.2015, 19:31  [ТС]     Объединить два похожих класса #5
Получается что метод Set может работать только с EnumA ? Нужно как нибудь обстрагироваться от конкретного Enuma.
zss
Модератор
Эксперт С++
6248 / 5851 / 1891
Регистрация: 18.12.2011
Сообщений: 14,990
Завершенные тесты: 1
01.07.2015, 19:35     Объединить два похожих класса #6
Почему это?
В строке 21 - с EnumA
а в 23 - с EnumB
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.07.2015, 19:38     Объединить два похожих класса
Еще ссылки по теме:

C++ Объединить два массива отсортированных по убыванию
C++ Объединить два контейнера set
Объединить два массива C++
C++ Объединить два упорядоченных массива
Объединить два одномерных массива C++ C++

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

Или воспользуйтесь поиском по форуму:
_stanislav
5 / 54 / 19
Регистрация: 16.08.2014
Сообщений: 383
Завершенные тесты: 2
01.07.2015, 19:38  [ТС]     Объединить два похожих класса #7
Это потому что структура энумов одинаковая, а вот если энумы разные?

Добавлено через 1 минуту
Создать дополнительный класс свойств? И передавать его в параметрах шаблона?
Yandex
Объявления
01.07.2015, 19:38     Объединить два похожих класса
Ответ Создать тему
Опции темы

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