Re: как развязать include
От: wander  
Дата: 18.08.10 19:03
Оценка: 2 (1)
Здравствуйте, sergey2b, Вы писали:

S>Подскажите пожалуйста как можно решить проблемму

S>имееться class A в котором часть полей указатели на функции определенные в f.h
S>очень не хотелось бы что бы f.h пришлось включать во все файлы где используеться class A

S>есть идея вынести все указатели на функции в отдельный класс connector

S>но получаеться так что независимо от того будет ли A наследником connector или в классе A будет указатель на connector придеться включать f.h тк f.h будет использоваться для определения class connector значит и connector.h будет содержать include "f.h"

S>подскажите пожалуйста как можно скрыть содержимое f.h


pimpl?
как развязать include
От: sergey2b ЮАР  
Дата: 18.08.10 18:59
Оценка:
Подскажите пожалуйста как можно решить проблемму
имееться class A в котором часть полей указатели на функции определенные в f.h
очень не хотелось бы что бы f.h пришлось включать во все файлы где используеться class A

есть идея вынести все указатели на функции в отдельный класс connector
но получаеться так что независимо от того будет ли A наследником connector или в классе A будет указатель на connector придеться включать f.h тк f.h будет использоваться для определения class connector значит и connector.h будет содержать include "f.h"

подскажите пожалуйста как можно скрыть содержимое f.h
Re[2]: как развязать include
От: sergey2b ЮАР  
Дата: 18.08.10 19:20
Оценка:
Здравствуйте, wander, Вы писали:

W>pimpl?


буду пробовать, похоже это то что мне нужно но с таким же успехом можно использовать и class тк class поддерживает ForwardDeclaration
Re: как развязать include
От: Кодт Россия  
Дата: 18.08.10 19:21
Оценка:
Здравствуйте, sergey2b, Вы писали:

S>имееться class A в котором часть полей указатели на функции определенные в f.h


Поля — указатели на функции?

Для этого достаточно иметь тип функции, а не сама функция.
Причём, если этот тип включает только указатели и ссылки, то достаточно предобъявления (forward declaration) типов, на что ссылается/указывает.
То есть, возможно, можно изначально обойтись без f.h

S>очень не хотелось бы что бы f.h пришлось включать во все файлы где используеться class A


S>есть идея вынести все указатели на функции в отдельный класс connector

S>но получаеться так что независимо от того будет ли A наследником connector или в классе A будет указатель на connector придеться включать f.h тк f.h будет использоваться для определения class connector значит и connector.h будет содержать include "f.h"

Можно сделать предобъявление класса коннектора, и держать указатель/ссылку на него.
Получим идиому pimpl.
С наследованием, понятное дело, такой фокус не пройдёт.
Перекуём баги на фичи!
Re[2]: как развязать include
От: sergey2b ЮАР  
Дата: 18.08.10 19:35
Оценка:
Здравствуйте, Кодт, Вы писали:

Для этого достаточно иметь тип функции, а не сама функция.

к сожалению так не получаеться так как в объявлении функций используються структуры и enum и как раз их объялвения не хотелось бы делать доступными
Re: развязать интерфэйс и реализацию
От: LelicDsp Россия  
Дата: 19.08.10 07:21
Оценка:
Сделать публично доступным A — как интерфэйс или абстрактный класс. И Сделать класс AImpl скажем который наследует от A но лежит полностью в бинарном виде. функция createA() (например) будет тоже полностью лежать в библиотеке и создавать объект класса AImpl но возвращать его как A.
Re[2]: развязать интерфэйс и реализацию
От: Mr.Delphist  
Дата: 25.08.10 21:50
Оценка:
Здравствуйте, LelicDsp, Вы писали:

LD>Сделать публично доступным A — как интерфэйс или абстрактный класс. И Сделать класс AImpl скажем который наследует от A но лежит полностью в бинарном виде. функция createA() (например) будет тоже полностью лежать в библиотеке и создавать объект класса AImpl но возвращать его как A.


Полностью присоединяюсь — опробовано в большом проекта, реально спасает от взаимной вермишели.
Re: как развязать include
От: uzhas Ниоткуда  
Дата: 26.08.10 05:46
Оценка:
Здравствуйте, sergey2b, Вы писали:

S>Подскажите пожалуйста как можно решить проблемму

для решения вашей проблемы я рекомендую вам ознакомиться с понятием абстрактный класс
их применяют для разрыва сильных связей между сущностями (см. принципы IoC http://en.wikipedia.org/wiki/Inversion_of_control, DIP http://en.wikipedia.org/wiki/Dependency_inversion_principle)
необходимо выделить интерфейс (http://www.refactoring.com/catalog/extractInterface.html) A и объявить его в файле a.h
a.h
class A
{
public:
  virtual ~A() {}
  virtual void method1() = 0;
  virtual void method2() = 0;
};


далее где-то (либо в новом файле, либо в a.h) объявить фабрику: auto_ptr<A> CreateConnectingA(...);
в файле connecting_a.cpp сделать имплементацию:
connecting_a.cpp
namespace
{
  class ConnectingA : public A
  {
  public:
    virtual void method1()
    {
       p1();
    }

    virtual void method2()
    {
      p2();
    }

  private:
    functPointer1 p1;
    functPointer2 p2;
  };
}
auto_ptr<A> CreateConnectingA(...)
{
  return auto_ptr<A>(new ConnectingA(...));
}

во все файлы где используеться class A надо будет включить a.h
выделенный интерфейс позволяет подменять реализации интерфейса без влияния на код клиентов
пляски вокруг странных енумов и указателей на функции можно совершать в файле connecting_a.cpp без какого-либо влияния на клиентов
зы: лично я идиому pimpl не использую, т.к. вижу в ней больше минусов, чем плюсов
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.