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

Artyom Trishkin #:

В инклудник его, и забыть

Не такого полёта птица - этот тестовый скрипт...

У меня нет проблем - я знаю где строка, и могу спокойно раскомментировать её. Просто сообщил разработчикам, может они не в курсе.

Artyom Trishkin #:

В инклудник его, и забыть

Вообще это в доках как минимум должно быть отражено.

Нельзя полноценно пользоваться сторонними библиотеками:
//Test1.mqh
#import "User32.dll" 
    void f();
#import
//Test2.mqh
#import "user32.dll"
    void g();
#import
#include "Test1.mqh"
#include "Test2.mqh"
void OnStart()
{
    User32::f(); //(1)//нормально
}

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

#include "Test2.mqh"
#include "Test1.mqh"
void OnStart()
{
    User32::f(); //(2)//Error: 'User32' is not a class, struct or union
}
А какая принципиальная разница между (1) и (2) ?
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-модификатора метода, в котором идет вызов.