Ошибки, баги, вопросы - страница 3385

 
A100 #:
Нельзя полноценно пользоваться сторонними библиотеками:

Казалось бы, все нормально, но нет, достаточно изменить порядок и сразу (на ровном месте) получаем ошибку:

А какая принципиальная разница между (1) и (2) ?

Регистрозависимое имя DLL при перестановке создало user32-класс, поэтому User32-класс создать не получается.

 
Подскажите, как получить имя класса объекта, на который ссылается указатель?
class BASE
{
public:  
  virtual string GetObjectClassName() { return(StringSubstr(__FUNCTION__, 0, StringFind(__FUNCTION__, "::"))); }
};

class CLASS1 : public BASE
{
public:  
  virtual string GetObjectClassName() { return(StringSubstr(__FUNCTION__, 0, StringFind(__FUNCTION__, "::"))); }
};

void OnStart()
{
  BASE* Pointer = new CLASS1;
  
  Print(Pointer.GetObjectClassName()); // CLASS1
  
  delete Pointer;
}

Выше пример, когда решается через дублирование virtual-кода каждый раз при наследовании. Другой способ есть?

 
fxsaber #:

Регистрозависимое имя DLL при перестановке создало user32-класс, поэтому User32-класс создать не получается.

В этом коде нет классов

 
A100 #:

В этом коде нет классов

Вам смысл непонятен?! Возьмите "класс" в кавычки, "namespace" или другое имя. Не могут "user32.dll" и "User32.dll" родить два скопа.

#import "User32.dll" // Создан "класс" User32.
    void f();
#import

#import "user32.dll" // "класс" user32 не создан, т.к. для этой DLL уже стоит в соответствии ранее созданный "класс".
    void g();
#import
 
fxsaber #:
Подскажите, как получить имя класса объекта, на который ссылается указатель?

Выше пример, когда решается через дублирование virtual-кода каждый раз при наследовании. Другой способ есть?

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

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

Alexey Navoykov, 2015.09.14 07:40

Предложение к разработчикам.   Надо бы ввести в язык функцию typeid, аналогично той, которая существует в C++.  Она позволяет в рантайме узнать имя класса, к которому принадлежит данный объект.  Причём не базового класса (как сейчас выдаёт ваш typename), а именно производного!  Это очень необходимо.  Иначе приходится городить огород, создавая функцию virtual string ClassName() в каждом производном классе.  И кроме того, typeid также позволяет быстро сравнивать между собой объекты на принадлежность к одному классу (по уникальному id класса).  А своими силами создавать уникальные id - это вообще пляски с бубнами.


Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Новая версия платформы MetaTrader 5 build 1930: Плавающие окна графиков и .Net библиотеки в MQL5

Alexey Navoykov, 2019.01.17 04:14

Добавьте, пожалуйста, в MQL аналог функции typeid из С++, позволяющий получить информацию о полиморфном типе объекта (имя типа и его хэш-код):

#include <typeinfo>

class A { virtual void f() { } };

class B : public A {  };

int _tmain(int argc, _TCHAR* argv[])  
{
  B b;
  A*p= &b;
  printf(typeid(*p).name());  // Получаем на экране: Class B
}

Это необходимая вещь в ООП.  Иначе приходится в каждом классе прописывать виртуальные методы для получения подобной информации, что выглядит костыльно и ненадёжно, учитывая что эта информация есть в системе.

 
fxsaber #:
Подскажите, как получить имя класса объекта, на который ссылается указатель?

Выше пример, когда решается через дублирование virtual-кода каждый раз при наследовании. Другой способ есть?

А почему не так:

class BASE
{
public:  
  virtual string GetObjectClassName() { return typename( this ); }
};

class CLASS1 : public BASE
{
public:  
  virtual string GetObjectClassName() { return typename( this ); }
};
 
Koldun Zloy #:

А почему не так:

Потому что результат typename зависит, например, от const-модификатора метода, в котором идет вызов.

 
fxsaber #:

Вам смысл непонятен?! Возьмите "класс" в кавычки, "namespace" или другое имя. Не могут "user32.dll" и "User32.dll" родить два скопа.

А почему не могут? Почему принципиально нельзя одной .dll два скопа в соответствие поставить?

 
A100 #:

А почему не могут?

Потому что архитектурно решили, что больше одного скопа на одну DLL делать - лишнее.

Что не сделано, так это насильное приведение всех названий #import-библиотек к одному регистру.


Ренат сообщил, чем будет MQ заниматься ближайший год. Точнее, чем кто-то пропланировал заниматься. Время показывает, что все это вилами по воде.

К чему? Невозможно понять логику приоритетов исправлений и планов. Что-то правят сразу, что-то - годами не правят. Так и с планами. Ничего не понять и не спланировать.

Есть, как есть.

 
fxsaber #:

Потому что результат typename зависит, например, от const-модификатора метода, в котором идет вызов.

Тогда так:

class BASE
{
public:  
  virtual string GetObjectClassName() { return "BASE"; }
};

class CLASS1 : public BASE
{
public:  
  virtual string GetObjectClassName() { return "CLASS1"; }
};
Причина обращения: