Указатели и объекты. Кто есть кто и как их использовать? - страница 2

 
DrSky #:

Не логично, но по всей видимости, это "защита от дурака" так как MQL используют не только программисты и проще автоматом приводить типы и разыменовывать указатели. При этом, даже когда требуется передать в функцию указатель - абсолютно без разницы будете ли вы использовать просто имя обьекта или с '&'/GetPointer(). 

Имя объекта вместо указателя нельзя передать:

class A {};
void f( A *a ) {}
void OnStart()
{
        A a;
        f( a ); //error: 'a' - parameter conversion not allowed
}

Не знаю в чем заключается защита, но отсутствие в MQL хотя бы равнозначности обращения . и -> лишает пользователя ранее изучившего C++ привычной для него формы записи, при том, что изучать MQL значительно проще не сам по себе, а после C++. Не говоря уже о том, что на ровном месте затрудняется перенос C++ кода на MQL

К сожалению такой define нельзя объявить

#define ->      .
 
A100 #:

Имя объекта вместо указателя нельзя передать:

Не знаю в чем заключается защита, но отсутствие в MQL хотя бы равнозначности обращения . и -> лишает пользователя ранее изучившего C++ привычной для него формы записи, при том, что изучать MQL значительно проще не сам по себе, а после C++. Не говоря уже о том, что на ровном месте затрудняется перенос C++ кода на MQL

К сожалению такой define нельзя объявить

. вместо -> это дань моде C# на момент создания.

сейчас в моде rust, я в ужасе от ожиданий

 
Maxim Kuznetsov #:

. вместо -> это дань моде C# на момент создания.

Можно и дань отдать и удобство соблюсти

 
A100 #:

Имя объекта вместо указателя нельзя передать:

...

Вариант 1:

class A {};
void f( A &a ) {}
void OnStart()
{
        A a;
        f( a ); //error: 'a' - parameter conversion not allowed
}

Вариант 2:

class A {};
void f( A *a ) {}
void OnStart()
{
        A a;
        f( &a ); //error: 'a' - parameter conversion not allowed
}

Вариант 3:

class A {};
void f( A *a ) {}
void OnStart()
{
        A a;
        f(GetPointer(a) ); //error: 'a' - parameter conversion not allowed
}
 
A100 #:

Имя объекта вместо указателя нельзя передать:

Не знаю в чем заключается защита, но отсутствие в MQL хотя бы равнозначности обращения . и -> лишает пользователя ранее изучившего C++ привычной для него формы записи, при том, что изучать MQL значительно проще не сам по себе, а после C++. Не говоря уже о том, что на ровном месте затрудняется перенос C++ кода на MQL

К сожалению такой define нельзя объявить

Ну, тут наверное упор на то, что C++ сник и так быстро разберется что к чему и быстро перестроится. А человек вообще не знакомый с C++ или программированием, сильно быстрее освоится. ) Задача то какая? Как можно быстрее научить пользователя писать бота и слить весь деп на кухне. )

 
A100 #:

Имя объекта вместо указателя нельзя передать:

Не знаю в чем заключается защита, но отсутствие в MQL хотя бы равнозначности обращения . и -> лишает пользователя ранее изучившего C++ привычной для него формы записи, при том, что изучать MQL значительно проще не сам по себе, а после C++. Не говоря уже о том, что на ровном месте затрудняется перенос C++ кода на MQL

К сожалению такой define нельзя объявить

С типом string все сложнее:

void foo1(const string& tmp_class) // Ok
{

}

void foo2(const string* tmp_class) // '*' - pointer cannot be used
{

}

  string tmp;
  
  foo1(tmp);  // Ok
  foo2(&tmp); // '&' - illegal operation use

Скорее всего потому, что string это wchar_t*, а двойной указатель не поддерживается.