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

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

Восстановить пароль Регистрация
 
_stanislav
26 / 26 / 8
Регистрация: 16.08.2014
Сообщений: 246
Завершенные тесты: 2
01.07.2015, 14:15     Объединить два похожих класса #1
Доброго времени суток. Есть два класса, полностью одинаковых в логике, различие только в том что один содержит один 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
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,164
Завершенные тесты: 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
26 / 26 / 8
Регистрация: 16.08.2014
Сообщений: 246
Завершенные тесты: 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
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,164
Завершенные тесты: 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
26 / 26 / 8
Регистрация: 16.08.2014
Сообщений: 246
Завершенные тесты: 2
01.07.2015, 19:31  [ТС]     Объединить два похожих класса #5
Получается что метод Set может работать только с EnumA ? Нужно как нибудь обстрагироваться от конкретного Enuma.
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,164
Завершенные тесты: 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++
Объединить два файла F1 и F2 в третий C++
C++ Объединить два упорядоченных массива в один

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

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

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

Текущее время: 03:05. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru