Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.06.2013, 19:54   #1
m_nuhop
Новичок
Джуниор
 
Регистрация: 30.06.2013
Сообщений: 8
По умолчанию Класс-интерфейс

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

1. проверка типа каждого класса в классе-интерфейсе и дальнейшее использование каждого класса через указатель по отдельности. В этом случае код сильно разбухает.
2. использование виртуальных функций базового класса ограничено, потому что в состав 15 классов входят другие, несвязанные между собой классы.
3. библиотка boost на данном этапе не рассматривается.

К существующим 15 классам со временем будут добавляться еще новые схожие классы, поэтому было бы неплохо, создав однажды класс-интерфейс, больше его не пересобирать.

Код:
class Base 
{ 
public:
  virtual void func() = 0;
}; 

class Derived1 : public Base 
{ 
public:
  Class1 *ptr1;
  void func();
};

...

class Derived15 : public Base 
{ 
public: 
  Class15 *ptr15;
  void func();
};
Выполнима ли данная задача и как?
m_nuhop вне форума Ответить с цитированием
Старый 30.06.2013, 22:30   #2
Igor95
Форумчанин
 
Регистрация: 03.01.2013
Сообщений: 388
По умолчанию

У Вас же инкапсуляция нарушена.
Код:
public: 
  Class15 *ptr15;
  void func();
Смесь данных и интерфейса.

Как вариант: можно задать область видимости данных-членов всех классов как protected. Сам же класс-инерфейс поместить вниз иерархии, виртуально пронаследовав данные всех классов, находящихся выше в иерархии.
Не самое лучшее решение, на мой взгляд. Еще подумаю.
Igor95 вне форума Ответить с цитированием
Старый 30.06.2013, 23:35   #3
m_nuhop
Новичок
Джуниор
 
Регистрация: 30.06.2013
Сообщений: 8
По умолчанию

Указатели на классы Class1, .. Class15 - есть указатели на динамические библиотеки, которые необходимы классам Derived1, .. Derived15. Без встроенных классов Class1, .. Class15 задача была бы решена за счет виртуальных функций базового класса. В целом, можно было бы иметь контейнер с указателями на классы Derived1, .. Derived15, например map <int, Base*> drv_map, но здесь возникает сложная проблема со срезкой (slicing).
m_nuhop вне форума Ответить с цитированием
Старый 30.06.2013, 23:50   #4
sVasilich
Форумчанин
 
Аватар для sVasilich
 
Регистрация: 16.12.2009
Сообщений: 224
По умолчанию

Цитата:
2. использование виртуальных функций базового класса ограничено, потому что в состав 15 классов входят другие, несвязанные между собой классы.
Может стоит попробовать цепочку обязанностей? Если класс не может выполнить запрос от клиента, он передаёт этот запрос дочернему классу.

Цитата:
К существующим 15 классам со временем будут добавляться еще новые схожие классы, поэтому было бы неплохо, создав однажды класс-интерфейс, больше его не пересобирать.
Цитата:
Есть порядка 15 классов, наследованных от одного базового полиморфного класса, и есть задача создания класса-интерфейса, который мог бы обращаться ко всем переменным и функциям этих 15 классов. Следующие имеющиеся варианты решения не подходят
Вообще, с такой постановкой задачи - ни как, так как инкапсуляции в принципе нет (как уже написали). Уточните требования.
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...
sVasilich вне форума Ответить с цитированием
Старый 01.07.2013, 06:59   #5
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

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

1. проверка типа каждого класса в классе-интерфейсе и дальнейшее использование каждого класса через указатель по отдельности. В этом случае код сильно разбухает.
Непонятно, чего вы пытаетесь добиться. Залезть в приватные данные к любому наследнику?

Но даже если бы они были публичные: что бы изменить переменную конкретного наследника, надо как минимум знать точно, что она у него вообще есть. А для того, что бы точно знать что есть в классе, нужно знать что это за класс.
_Bers вне форума Ответить с цитированием
Старый 01.07.2013, 09:01   #6
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
Непонятно, чего вы пытаетесь добиться. Залезть в приватные данные к любому наследнику?
Я тоже ничего не понял из первого поста, но чуть почитал тему, и мне кажеца, что ТС ищет что-то типа объектного пула прототипов
Цитата:
но здесь возникает сложная проблема со срезкой (slicing).
поясни проблему?
rrrFer вне форума Ответить с цитированием
Старый 01.07.2013, 09:03   #7
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от rrrFer Посмотреть сообщение
Я тоже ничего не понял из первого поста, но чуть почитал тему, и мне кажеца, что ТС ищет что-то типа объектного пула прототипов

поясни проблему?
что такое "объектный пул прототипов" ?
_Bers вне форума Ответить с цитированием
Старый 01.07.2013, 12:07   #8
m_nuhop
Новичок
Джуниор
 
Регистрация: 30.06.2013
Сообщений: 8
По умолчанию

Задача сводится к тому, чтобы класс-интерфейс мог в зависимости от выбора пользователя обратиться к открытым переменным и открытым функциям классов Derived1, .. Derived15. Темы на форуме не было бы, если бы отсутствовали указатели на динамические библиотеки Class1, .. Class15. Класс Derived1 задумывался как одно целое с Class1 с точки зрения обработки данных.

1. Когда в класс-интерфейс передается указатель на Derived1, .. Derived15 вместе с типом класса ( например, для для класса Derived1 передаем 1, для Derived2 - 2, ...), то с помощью RTTI класс-интерфейс работает без замечаний. Правда, при этом увеличивается код, чего хотелось бы избежать.
2. При применении виртуальных функций базового класса не удается втащить классы Class1, .. Class15 в базовый класс или сослаться на них через указатель базового класса.

Код:
class Base 
{ 
public:
  virtual void func() = 0;
  virtual int get_a() = 0;
  virtual ~Base() {};
  ...
}; 

class Derived1 : public Base 
{
  int a;
public:
  Class1 *ptr1;
  void func();
  int get_a() { return a; }
  ...
};

...

class Derived15 : public Base 
{ 
  int a;
public: 
  Class15 *ptr15;
  void func();
  int get_a() { return a; }
  ...
};

class Intrfc
{
  Base *ptrBase;
public:
  Intrfc( Base *ptr ) { ptrBase = ptr; }
  ~Intrfc() {};
  void Intrfc_func();
};

void Intrfc::Intrfc_func()
{
  ptrBase->func();            // ok
  ptrBase->get_a();          // ok

  // Здесь необходимы данные от классов Class1, .. Class15
  ... 
}

int main()
{
  ...
  Base *base_ptr;
  Intrfc *intrfc_ptr;

  Derived1 *drv1_ptr = new Derived1;
  ...
  Derived15 *drv15_ptr = new Derived15;

  if ( event1 )
  {
    base_ptr = dynamic_cast <Base*> (drv1_ptr);
  }
  else if ( event2 )
  {
     ...
  }

  intrfc_ptr = new Intrfc( base_ptr );
  intrfc_ptr->ptrBase->func();            // ok
  intrfc_ptr->ptrBase->get_a();          // ok
  ...

  return 0;
}
Отсюда, или есть хитрый способ использовать указатели на классы Class1, .. Class15 внутри класса Intrfc или же необходимо изменить архитектуру классов. Как это можно сделать?
m_nuhop вне форума Ответить с цитированием
Старый 01.07.2013, 13:15   #9
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Цитата:
Сообщение от m_nuhop Посмотреть сообщение
Задача сводится к тому, чтобы класс-интерфейс мог в зависимости от выбора пользователя обратиться к открытым переменным и открытым функциям классов Derived1, .. Derived15.
Все зависит от того, с какой целью это нужно. Что значит "обратится к переменным"?
waleri вне форума Ответить с цитированием
Старый 01.07.2013, 15:03   #10
m_nuhop
Новичок
Джуниор
 
Регистрация: 30.06.2013
Сообщений: 8
По умолчанию

Обращение к переменным необходимо для создания универсального интерфейса к классам Derived1, .. Derived15.
m_nuhop вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получить по ссылке на интерфейс указатель на класс в котором он реализован LISTAT Общие вопросы Delphi 9 24.01.2013 12:06
Cоздать класс жидкость. определить конструкторы деструкторы и функцию печати. создать публик производный класс. (С++) Динар Габбасов Помощь студентам 0 28.05.2012 18:44
Добавить класс в проект2,похожий на класс из проекта1!оба проекта есть! xeops C# (си шарп) 0 15.05.2012 20:31
Класс запускает поток, который заполняет этот класс. Обмен класс <=> поток. Человек_Борща Общие вопросы Delphi 8 27.02.2012 23:24
разработать интерфейс для дисков - интерфейс програмный Notformal Помощь студентам 0 01.11.2011 22:52