Обсуждение статьи "Основы объектно-ориентированного программирования" - страница 3

 

1) подумалось, здесь ошибка:

раздел: Передача параметров в конструктор

"Функция Init() отставлена в секции private для обеспечения возможности переинициализации класса."

возможно:

Функция Init() отставлена в секции public для обеспечения возможности переинициализации класса. 

 2) Приведите, пожалуйста, пример использования возможности "создать массив с экземплярами классов (объектами)", для раздела" Массив объектов". Сам, к сожалению, не могу сообразить "с чем это едят".

3) в разделе "Еще об инкапсуляции (private, protected, public)" вскользь обозначено базовый класс->класс потомок. Возможно, эту данность (class Class: public CBase) надо в начале раздела объяснить, т.к. позже сообразил.

4) не нашёл:Рис.6. Видимость "лишней" функции (красная стрелка) определяется типом указателя, с помощью которого загружен класс. Этот пример находится в приложении в файле OOP_sDefaultVirtual_1.mq5.

5) Не нашёл четкого указания, что такое библиотека. Видимо, способ хранения класса(классов) функций? т.е. аналогично включаемому файлу, только включаемый файл - хранится в виде исходника, а библиотека в виде скомпилированной dll?

Огромное Спасибо за статью! Особенно порадовало, последовательное изложение материала.

Документация по MQL5: Основы языка / Функции / Передача параметров
Документация по MQL5: Основы языка / Функции / Передача параметров
  • www.mql5.com
Основы языка / Функции / Передача параметров - Документация по MQL5
 
bivmail:

1) подумалось, здесь ошибка:

раздел: Передача параметров в конструктор

"Функция Init() отставлена в секции private для обеспечения возможности переинициализации класса."

возможно:

Функция Init() отставлена в секции public для обеспечения возможности переинициализации класса. 

 2) Приведите, пожалуйста, пример использования возможности "создать массив с экземплярами классов (объектами)", для раздела" Массив объектов". Сам, к сожалению, не могу сообразить "с чем это едят".

3) в разделе "Еще об инкапсуляции (private, protected, public)" вскользь обозначено базовый класс->класс потомок. Возможно, эту данность (class Class: public CBase) надо в начале раздела объяснить, т.к. позже сообразил.

4) не нашёл:Рис.6. Видимость "лишней" функции (красная стрелка) определяется типом указателя, с помощью которого загружен класс. Этот пример находится в приложении в файле OOP_sDefaultVirtual_1.mq5.

5) Не нашёл четкого указания, что такое библиотека. Видимо, способ хранения класса(классов) функций? т.е. аналогично включаемому файлу, только включаемый файл - хранится в виде исходника, а библиотека в виде скомпилированной dll?

Огромное Спасибо за статью! Особенно порадовало, последовательное изложение материала.

1. Да. 

2. Есть пример в разделе "Массив объектов", собственно весь раздел это пример с описанием.

3. Рассматривается в разделе "Использование ООП для изменения логики работы программы".

4. Слова "Этот пример находится в приложении в файле..."  означает, что в файле находится пример к разделу обозначенному загловком раздела. Это восе не означает, что в примерах продублировано все, про что написано в статье. Этих примеров вообще может не быть, все написано в статье. Но примеры есть, можете брать их за основу и экспериментировать. Первична статья, примеры вторичны.

5. Уже давно указано: http://ru.wikipedia.org/wiki/%C1%E8%E1%EB%E8%EE%F2%E5%EA%E0_(%EF%F0%EE%E3%F0%E0%EC%EC%E8%F0%EE%E2%E0%ED%E8%E5)

[Удален]  
Спасибо. Хорошая статья.
[Удален]  

Очень интересная статья, написанная грамотным "доступным" языком.

Автору спасибо.

 
Спасибо. Эта статья мне очень помогла. Я переводил свой EA на ООП и у меня была особая проблема с массивами классов. Динамические указатели объяснены четко и отлично. Спасибо еще раз.
 
Очень хорошо распиана статья! наконец то я это понял автору спасибо
 

У меня есть два примера кода, основанных/скопированных из этой статьи. Они оба создают массив указателей на класс и затем удаляют их при выходе. Однако один выходит с утечкой памяти, а другой выходит без утечки памяти. Единственное различие заключается в том, что во втором примере 'Alert' в деструкторе закомментирован. Когда предупреждение в деструкторе удаляется, происходит утечка памяти. Это очень странно. Кто-нибудь может объяснить??? Пожалуйста, помогите, это сводит меня с ума.

В конце примеров кода из этой статьи я включил очень простой пример кода, который я написал, который также имеет утечку памяти. Опять же, почему???? В этом последнем примере кода нет ничего сложного...


Этот код работает без утечки памяти:

class CName
  {
private:
   int               m_arg; // Переменная для экземпляра
public:
                     CName(int aArg)
     { // Конструктор
      m_arg=aArg;
      //Alert("Конструктор "+IntegerToString(m_arg));
     }
                    ~CName()
     { // Деструктор
      Alert("Destructor "+IntegerToString(m_arg));
     }
  };
//---
CName *cname[]; // Массив

void OnInit()
  {
// Подготовьте массив для загрузки десяти экземпляров класса
   ArrayResize(cname,10);

   for(int i=0;i<10;i++)
     { // Загрузите экземпляры
      cname[i]=new CName(i);
     }
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   for(int i=0;i<10;i++)
     { // В конце выгрузите все экземпляры из памяти
      delete(cname[i]);
     }
}

Сообщения из журнала эксперта, обратите внимание на отсутствие утечки памяти:

PI 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 Destructor 0

KP 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 Деструктор 1

JG 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 Деструктор 2

EN 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 Деструктор 3

LF 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 Деструктор 4

OM 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 Деструктор 5

FD 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 Destructor 6

IK 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 Destructor 7

HS 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 Destructor 8

CJ 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 Destructor 9

Этот код завершается с утечкой памяти!!!! Почему????????? Единственное отличие - это раскомментирование 'Alert' в деструкторе...

class CName
     {
private:
   int               m_arg; // Переменная для экземпляра
public:
                     CName(int aArg)
     { // Конструктор
      m_arg=aArg;
      //Alert("Конструктор "+IntegerToString(m_arg));
     }
                    ~CName()
     { // Деструктор
      //Alert("Деструктор "+IntegerToString(m_arg));
     }
  };
//---

CName *cname[]; // Массив

void OnInit()
  {
// Подготовьте массив для загрузки десяти экземпляров класса
   ArrayResize(cname,10);

   for(int i=0;i<10;i++)
     { // Загрузите экземпляры
      cname[i]=new CName(i);
     }
  }

//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   for(int i=0;i<10;i++)
     { // В конце выгрузите все экземпляры из памяти
      delete(cname[i]);
     }
}

Сообщения из экспертного журнала, обратите внимание на утечку памяти:

FM 1 OOP_sConstDestr_2 (EURUSD,M1) 13:51:19 Осталось 10 не удаленных объектов.

EG 1 OOP_sConstDestr_2 (EURUSD,M1) 13:51:19 Осталось 10 объектов типа CName

GO 1 OOP_sConstDestr_2 (EURUSD,M1) 13:51:19 200 байт утечки памяти

Последний пример, мой код, очень простой, но завершается с утечкой памяти....

class CCandleStick
{
public:
   CCandleStick() { };
  ~CCandleStick() { };
};

CCandleStick *cCandleArray[];

//+------------------------------------------------------------------+
//| Функция инициализации эксперта|
//+------------------------------------------------------------------+
void OnInit()
  {
   ArrayResize(cCandleArray, 10);
   for (int i = 0; i < 10; i++) {
      cCandleArray[i] = new CCandleStick();
   }   
  }
//+------------------------------------------------------------------+
//| Функция деинициализации эксперта|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   for (int i = 0; i < 10; i++) {
      delete(cCandleArray[i]);
   }   
   Print("Last Error- ", GetLastError(), "   Current time: ", TimeCurrent());
  }

Сообщения из журнала эксперта, обратите внимание на утечку памяти:

MR 0 tester (EURUSD,M1) 14:07:23 Последняя ошибка - 0 Текущее время: 2013.02.06 23:07:23

FL 1 tester (EURUSD,M1) 14:07:23 Осталось 10 не удаленных объектов

KN 1 tester (EURUSD,M1) 14:07:23 Осталось 10 объектов типа CCandleStick

JS 1 tester (EURUSD,M1) 14:07:23 160 байт утечки памяти



Documentation on MQL5: Date and Time / TimeCurrent
  • www.mql5.com
Date and Time / TimeCurrent - Documentation on MQL5
 
wulidancing:

У меня есть два примера...

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

Используйте кнопку SRC для вставки кода (лучше - прикрепляйте файлы).

Sorry for my english:)

MQL5.community - User Memo
  • 2010.02.25
  • MetaQuotes Software Corp.
  • www.mql5.com
You have just registered and most likely you have questions such as, "How do I insert a picture to my a message?" "How do I format my MQL5 source code?" "Where are my personal messages kept?" You may have many other questions. In this article, we have prepared some hands-on tips that will help you get accustomed in MQL5.community and take full advantage of its available features.
 
ООП - это современный язык программирования, но чтобы понять его и написать код, нам нужно много времени и усилий. Спасибо за хорошую статью
 
Integer:

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

Используйте кнопку SRC для вставки кода (лучше - прикрепляйте файлы).

Sorry for my english:)

Большое спасибо, что нашли время ответить. Я не уверен, что вы видели мой последующий вопрос. Он был в отдельном комментарии, который, вероятно, был удален, потому что я не очень хорошо знаком с этим форумом. Тем не менее, я попробовал запустить все три примера на старом компьютере со старой версией MetaTrader. В старой версии все три примера работали нормально. Он не генерировал ошибку "утечки памяти" экспертного журнала, я думаю, это был билд 560??, ни для одного из примеров кода. Кажется, это был билд 560??? Я не помню, и я обновил билд 560 до нового билда 756. После нового билда у меня те же проблемы с утечкой памяти. Возможно ли, что старый билд не сообщал о проблемах с утечкой памяти, потому что это не было функцией? Какой билд вы используете? Еще раз спасибо.