Вопросы по ООП в MQL5 - страница 86

 
Igor Makanu:

это логично

но подозреваю, что весь смысл - использование со статическими методами

тестить нужно, правда не придумал как, вот и спросил


UPD: вчера бегло гуглил эту тему, много упоминаний на приватный деструктор, тож подумать нужно, что это дать может

Статические методы не имеют указателя this, и никаких действий через этот указатель сделать не может.

Приватный деструктор гарантирует, что удаление объекта будет произведено самим объектом. Но, как я уже сказал выше - на мой взгляд, это не очень хорошая практика, которой следует избегать (хотя, иногда она весьма удобна, и в НЕКОТОРЫХ случаях пользоваться ею допустимо).

 
Georgiy Merts:

Статические методы не имеют указателя this, и никаких действий через этот указатель сделать не может.

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

пока цель посмотреть на эту конструкцию, ни разу не пробовал да и не распространенный способ


Sergey Dzyublik:

1) Из статических методов запрещен доступ к this.
Где приметяют "delete &this;" - https://stackoverflow.com/questions/447379/what-is-the-use-of-delete-this

2) Приватный дестуктор запрещает создавать объект на стеке, однако по прежднему через оператор new объект можно создать, на этот раз в куче:

Вот вам и еще одно исопльзование delete &this.

спасибо,  проверю, это полезно




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

delete &this;

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

 
Igor Makanu:

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

пока цель посмотреть на эту конструкцию, ни разу не пробовал да и не распространенный способ


спасибо,  проверю, это полезно




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

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

Не заморачивайтесь, Вам это никогда не понадобится.

Прежде чем разбираться с такими вещами, нужно разобраться с основами языка.

 
Koldun Zloy:

Не заморачивайтесь, Вам это никогда не понадобится.

это не правильное утверждение, если не расширять кругозор, то конечно и не понадобится

Koldun Zloy:

Прежде чем разбираться с такими вещами, нужно разобраться с основами языка.

разбираюсь по мере возможностей, хотя в целом 90+% задач под MQL решаю слету, задачи обычно типовые да и большинство задач уже решены и в свободном доступе



по поводу delete &this; ... делал класс-ордер, который сам следил за открытием и при реквотах мог повторно пробовать открыть ордер ... да и много, что еще умеет,

создавал и удалял этот обьект (класс-ордер) из другого класса, поэкспериментирую, возможно delete &this; будет удобнее использовать

 

Интересно это глюк или особенность)

Внутри экземпляра класса находится структура.

Ставлю точку, что бы увидеть содержимое структуры.
Но оно отображается, только если поставить квадратные скобки.
Хотя структура в одном экземпляре.

проблема решается если класс не является элементом массива.




ну и сам код для "тырканья"

class ABC
{   
   public:         
           struct ST
           {    
              int r;
              int U;
                  ST() {r=0; U=0;}           
           };
           ST st;
};
ABC abc[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {

abc[0].st.r;

   return(INIT_SUCCEEDED);
  }
 
Pavel Verveyko:

Интересно это глюк или особенность)

Внутри экземпляра класса находится структура.

Ставлю точку, что бы увидеть содержимое структуры.
Но оно отображается, только если поставить квадратные скобки.
Хотя структура в одном экземпляре.

проблема решается если класс не является элементом массива.




ну и сам код для "тырканья"

вот так наверное правильнее :-)

 
Maxim Kuznetsov:

вот так наверное правильнее :-)

может быть) но сути по поводу всплывающей подсказки не меняет)

 
Pavel Verveyko:

Интересно это глюк или особенность)

Внутри экземпляра класса находится структура.

Ставлю точку, что бы увидеть содержимое структуры.
Но оно отображается, только если поставить квадратные скобки.
Хотя структура в одном экземпляре.

проблема решается если класс не является элементом массива.




ну и сам код для "тырканья"

Очередной баг редактора(
 

https://www.ibm.com/support/knowledgecenter/ru/ssw_aix_72/performance/coding_style_best_perf.html

Везде, где это возможно, заменяйте глобальные переменные локальными.

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


Если необходимо обратиться к глобальной переменной (которая не является общей переменной для этой и других нитей), скопируйте ее значение в локальную переменную и работайте с копией.

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


если я в моем примере:

class CEA
{
private:
   double            _Ask, _Bid;
public:
   void              onTick(const MqlTick &tick);
};
//+------------------------------------------------------------------+
void CEA::onTick(const MqlTick &tick)
{
   _Ask = tick.ask;
   _Bid = tick.bid;
}

в методе onTick() скопирую значения аск и бид и буду в остальных методах использовать _Ask, _Bid (виртуальная торговля)

то будет ли это аналогично работе с глобальными переменными? 

ЗЫ: как вариант, могу конечно передавать по ссылке &tick во все методы, но опять же вопросы, что эффективнее

 
Igor Makanu:

https://www.ibm.com/support/knowledgecenter/ru/ssw_aix_72/performance/coding_style_best_perf.html


если я в моем примере:

в методе onTick() скопирую значения аск и бид и буду в остальных методах использовать _Ask, _Bid (виртуальная торговля)

то будет ли это аналогично работе с глобальными переменными? 

ЗЫ: как вариант, могу конечно передавать по ссылке &tick во все методы, но опять же вопросы, что эффективнее

Igor Makanu:

https://www.ibm.com/support/knowledgecenter/ru/ssw_aix_72/performance/coding_style_best_perf.html


если я в моем примере:

в методе onTick() скопирую значения аск и бид и буду в остальных методах использовать _Ask, _Bid (виртуальная торговля)

то будет ли это аналогично работе с глобальными переменными? 

ЗЫ: как вариант, могу конечно передавать по ссылке &tick во все методы, но опять же вопросы, что эффективнее

Вопрос. А зачем козе баян? Если в одном методе, одного класса, в сферическом коне, да в физическом вакууме (ну выпимши я)))), то да, имеет смысл. А если в реальном проекте, то, либо класс на глобальном уровне, либо одиночка, который всю эту трихомудину (сорри за лишний бурбон))))) обрабатывает в начале обработчика, и,запрашивай напрямую из него в любом месте)))
Причина обращения: