Вызов функций из библиотеки, не пренадлежащих оной. - страница 2

 
joo:
Про виртуальность методов помню и использую. Но как быть, если класс прописан в либе, а виртуальный метод в основной части программы? - ведь тогда даже не удастся объявить дочерний объект класса, прописанного в либе.

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

Либа видит только то что есть в ней, в том числе и другие либы если они подключены внутри. Ничего извне либа не видит.

Данные в функции либы передаются через параметры.

Если нужно чтоб функция была доступна и в либе и в коде скрипта (куда либа подключена) залей нужную функцию в отдельную ЛИБУ и подключи и к скрипту и к либе.

Таким образом при необходимости внести изменения достаточно будет изменить функцию в общей ЛИБЕ.


А лучше опиши суть задачи, может не там копаем?

 
Urain:
...

типа, так?:

//+------------------------------------------------------------------+
//|                                                          Lib.mq5 |
//+------------------------------------------------------------------+
#property library
double m=0.0;

void F()export
  {
   m=1.0;
  }

void G(double &a)export
  {
   a=m;
  }
//+------------------------------------------------------------------+
//|                                                         Lib2.mq5 |
//+------------------------------------------------------------------+
#property library
#import "Lib.ex5"
void F();
void G(double &a);
#import

void P(double &c)export
  {
   G(c);
  }
//+------------------------------------------------------------------+
//|                                                    ex script.mq5 |
//+------------------------------------------------------------------+
#import "Lib.ex5"
void F();
void G(double &a);
#import

#import "Lib2.ex5"
void P(double &c);
#import

void OnStart()
  {
   double a=0.0;
   double b=0.0;
   F();
   G(a);
   Print("a ",a);
   P(b);
   Print("b ",b);
  }

Ох, шарик за ролик закатывается.. надо осмыслить, что это даёт.

 
joo:

типа, так?:

Ох, шарик за ролик закатывается.. надо осмыслить, что это даёт.

Да, как то так.

Это даёт то что ты можешь править Lib не затрагивая Lib2 которая отлажена и лежит в сторонке.

Главное чтоб атрибуты сохранялись неизменными.



 
mql5:
Можно использовать виртуальность методов.

Хехе :) А примерчик можно?

Сейчас есть хоть какая-то возможность импортировать классы?

Абстракция продолжает течь :)

 
TheXpert:

А примерчик можно?


Во-первых пример на функциях

библиотека lib.ex5

#import "..\Scripts\prog.ex5"
void f();
#import

void F() export
  {
   f();
  }

скрипт prog.ex5

#import "lib.ex5"
   void F();
#import

void f() export
  {
   Print("!");
  }

void OnStart()
  {
   F();
  }
 

Использование виртуальных методов

connector.mqh

class CConnector
  {
public:
   virtual void Print() { }
  };

библиотека lib.ex5

#include <connector.mqh>

void F(CConnector *con) export
  {
   con.Print();
  }

cкрипт prog.ex5

#include <connector.mqh>

#import "lib.ex5"
   void F(CConnector *con);
#import

class CMyConnector : public CConnector
  {
public:
   virtual void Print() { ::Print("!"); }
  };

void OnStart()
  {
   CMyConnector con;
   F(GetPointer(con));
  }




 
TheXpert:

Сейчас есть хоть какая-то возможность импортировать классы?

Такой возможности пока нет.
 
mql5:

Использование виртуальных методов

именно это я и хотел предложить но даже не сильно удивился, когда не скомпилилось.

Справка выдала:

В импортируемых функциях в качестве параметров нельзя использовать:

Первый пример вообще не в счет, там объектов нет.

Короче даже не напильник надо, а рубанок погрубее.

_________________________________________________

ЗЫ: извини, Андрей, я пас. Похоже если в параметрах функции есть объект, задачка не решаема. И общая задумка не реализуема...

 

Пример с виртуальностью рабочий, видимо Вы не правильно его "собрали".

Попробуйте воспользоваться архивом.


Файлы:
MQL5.zip  2 kb
 
mql5:

Пример с виртуальностью рабочий, видимо Вы не правильно его "собрали".

Попробуйте воспользоваться архивом.


Забрал себе на перепроверку. Скомпилировал, запустил. Работает, как задумано автором.