Экспорт\импорт классов?

 

Суть проблемы -- при большом количестве файлов и классов в проекте становится сложно разнести весь проект по файлам.

Сложность состоит в том, нет нормального метода отделения имплементации от объявления.

Т.е. в итоге все равно получается, что весь проект инклудами собирается в одном файле.


Решение состоит в том, чтобы сделать возможным импортирование классов из библиотек, как это на данный момент можно делать с функциями.

Что я имею в виду:


допустим у нас есть класс:


class SomeClass
{
public:
   SomeClass();
};

Помещаем его объявление в include файл. (скажем, SomeClass.mqh)


Далее создаем библиотеку: SomeClass.mq5


#include <SomeClass.mqh>

SomeClass::SomeClass()
{
   Print("Hello");
}

Далее используем класс


#include <SomeClass.mqh>

#import "SomeClass.ex5" // можно заменить на другую директиву
   class SomeClass;
#import

int OnInit()
{
   SomeClass obj;
}
Что скажете, разработчики?
 
TheXpert :
Что скажете, разработчики?

Поддерживаю.

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

 
MetaDriver :

На сегодня сокрытие реализации классов вообще невозможно.


Атнють, виртуальность вам в помощь!
 
mql5 :
Атнють, виртуальность вам в помощь!

Серьезно что ли? Для того, чтобы создать указатель на конечный класс, нужно определение конечного класса.

 
mql5 :
Атнють, виртуальность вам в помощь!

А чем виртуальность может помочь?

MetaDriver :
На сегодня сокрытие реализации классов вообще невозможно.

Здесь я имею в виду не "логическое" сокрытие реализации, а "физическую" недоступность исходного текста для пользователя класса. // например в случае коммерческой библиотеки

 

Примерно так


Открытая часть public.mqh

class CHiddenInterface

  {
public:
   virtual void HiddeMethod() { /* nothing */ }

  };


Закрытая часть hidden.mq5
class CSomeObject : public CHiddenInterface

  {
public:

   virtual void HiddeMethod() { Print("Hellow from hidden method"); }

  };

CHiddenInterface *GetInterface() export

  {
   return(new CSomeObject());

  }


Использование
#include "public.mqh"
#import "hidden.ex5"
    CHiddenInterface *GetInterface();
#import

void OnStart()
  {
   CHiddenInterface *p=GetInterface();
   p.HiddenMethod();
   delete p;
  }

 
mql5 :

Примерно так

Принимается (пока), но это ГЧЖ и жутко неудобно.

 
mql5 :

Примерно так

Закрытая часть hidden.mq5
class CSomeObject : public CHiddenInterface

  {
public:

   virtual void HiddeMethod() { Print("Hellow from hidden method"); }

  };

CHiddenInterface *GetInterface() export

  {
   return(new CSomeObject());

  }


Использование
#include "public.mqh"
#import "hidden.ex5"
    CHiddenInterface *GetInterface();
#import

void OnStart()
  {
   CHiddenInterface *p=GetInterface();
   p.HiddenMethod();
   delete p;
  }


Вау!  Так теперь можно определять классы в библиотеках?  Здорово если так.

Я пробовал с месяц назад, у меня классы компилироваться не захотели.

Домой приду проверю. // Сейчас на работе.

Но экспортировать-импортировать по прежнему можно только функции, так?  Я правильно понял?

 
TheXpert :

Принимается (пока), но это ГЧЖ и жутко неудобно.


А шо це ГЧЖ ? 

:)

 
MetaDriver :

А шо це ГЧЖ ?

Гланды через ... 

1. для сокрытия реализации обязательно создавать его пустую копию

2. работа только через указатели, что само по себе чревато, пусть сборщик мусора и присутствует.

3. невозможность работать напрямую с классом.

 
TheXpert :

Гланды через ... 

1. для сокрытия реализации обязательно создавать его пустую копию

2. работа только через указатели, что само по себе чревато, пусть сборщик мусора и присутствует.

3. невозможность работать напрямую с классом.


Пока только так, мы сейчас рассматриваем вариант экспорта/импорта классов похожий на ваше предложение...

Причина обращения: