Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Интересно узнать о развитии MQL5.community? Заходи в раздел Стена!
Комбинатор
15929
Комбинатор 2009.12.09 11:44 

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

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

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


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

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


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


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;
}
Что скажете, разработчики?
Vladimir Gomonov
8277
Vladimir Gomonov 2009.12.09 12:25  
TheXpert :
Что скажете, разработчики?

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

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

Ilyas
1205
Ilyas 2009.12.09 12:30  
MetaDriver :

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


Атнють, виртуальность вам в помощь!
Комбинатор
15929
Комбинатор 2009.12.09 12:40  
mql5 :
Атнють, виртуальность вам в помощь!

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

Vladimir Gomonov
8277
Vladimir Gomonov 2009.12.09 12:42  
mql5 :
Атнють, виртуальность вам в помощь!

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

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

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

Ilyas
1205
Ilyas 2009.12.09 15:09  

Примерно так


Открытая часть 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;
  }

Комбинатор
15929
Комбинатор 2009.12.09 17:08  
mql5 :

Примерно так

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

Vladimir Gomonov
8277
Vladimir Gomonov 2009.12.09 17:08  
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;
  }


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

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

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

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

Vladimir Gomonov
8277
Vladimir Gomonov 2009.12.09 17:10  
TheXpert :

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


А шо це ГЧЖ ? 

:)

Комбинатор
15929
Комбинатор 2009.12.09 18:09  
MetaDriver :

А шо це ГЧЖ ?

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

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

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

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

Ilyas
1205
Ilyas 2009.12.09 19:10  
TheXpert :

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

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

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

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


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

12345
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий