Обсуждение статьи "Когда нужно использовать указатели в MQL5" - страница 2

 

Добрый день. Я начинающий. У меня вопрос касаемо использования значка "*" (звездочка).

в файле samplelist: 

class CListItem
  {
private:
   int               ID;
   CListItem        *next;
   CListItem        *prev;

 "*" используется для объявления указателя на объект- это, вроде понятно. 

 Далее же:

public:
                    ~CListItem();
   ...
   CListItem*        next(){return(next);}
   CListItem*        prev(){return(prev);}

Непонятно, что означет поставленный т.о. знак "*".

Согласно справке "существует возможность динамически создавать объекты сложного типа. Это делается при помощи оператора new." Здесь же не используется оператор new. Поясните пожалуйста более подробно как и в каких случаях можно использовать знак "*".

Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
  • www.mql5.com
Основы языка / Операторы / Оператор создания объекта new - Документация по MQL5
 
kogriv:

 Далее же:

Непонятно, что означет поставленный т.о. знак "*".


Можете написать так

public:
                    ~CListItem();
   ...
   CListItem        *next(){return(next);}
   CListItem        *prev(){return(prev);}

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

 
Rosh:

Можете написать так

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

 

Т.е. 

CListItem        *next(){return(next);}

это объявление указателя на объект (или на метод?) next()? А далее, в фигурных скобках- возвращается сам объект next? Я правильно понимаю?

 

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

 

 
kogriv:

 Т.е. 

это объявление указателя на объект (или на метод?) next()?

Это говорит о том, что функция next() возвращает указатель на переменную класса CListItem.
 
kogriv:

А далее, в фигурных скобках- возвращается сам объект next? Я правильно понимаю?

В фигурных скобках дано тело функции,

{return(next);}

это означает, что функция вернет переменную next, которая имеет тип указатель на объект класса CListItem. Что в общем-то и согласуется с типом функции.

Документация по MQL5: Основы языка / Типы данных / Структуры и классы
Документация по MQL5: Основы языка / Типы данных / Структуры и классы
  • www.mql5.com
Основы языка / Типы данных / Структуры и классы - Документация по MQL5
 

Сразу после первого примера в статье идёт фраза "Переменная pstatus является указателем объекта, но сам объект мы преднамеренно "забыли" создать оператором new, и передали его в качестве параметра в функцию PrintStatus()".

1. Непонятно, "кого именно" передали - указатель, объект?

2. В примере нет функции  PrintStatus().

 

По-моему ошибка:

//+------------------------------------------------------------------+
//| добавление элемента в список                                     |
//+------------------------------------------------------------------+
CList::addItem(CListItem *item)
  {
//--- сначала проверим корректность переданного указателя
   if(CheckPointer(item)==POINTER_INVALID) return;
//--- увеличим счетчик элементов в списке
   m_counter++;
//--- если элементов в списке еще нет
   if(CheckPointer(first)!=POINTER_DYNAMIC)
     {
      first=item;
     }
   else
     {
      //--- установим для item указатель предыдущего объекта                                         ----------------------- Начало ошибки-----------------------
      item.prev(first);
      //--- запомним указатель текущего первого элемента
      CListItem *p=first;
      //--- поставим на место первого элемента входящий item
      first=item;
      //--- установим для первого элемента списка указатель следующего объекта
      first.next(p);
     }
  } 
Выходит что у нового элемента списка prev и first ссылаются на второй элемент, а второй элемент не получает ссылки на первый элемент.
 
Yedelkin:

Сразу после первого примера в статье идёт фраза "Переменная pstatus является указателем объекта, но сам объект мы преднамеренно "забыли" создать оператором new, и передали его в качестве параметра в функцию PrintStatus()".

1. Непонятно, "кого именно" передали - указатель, объект?

2. В примере нет функции  PrintStatus().

Лучше поздно, чем никогда. Спасибо, исправлено в статье. Убрано окончание предложения

Сразу после первого примера в статье идёт фраза "Переменная pstatus является указателем объекта, но сам объект мы преднамеренно "забыли" создать оператором new, и передали его в качестве параметра в функцию PrintStatus()".


 
220Volt:

По-моему ошибка:

Выходит что у нового элемента списка prev и first ссылаются на второй элемент, а второй элемент не получает ссылки на первый элемент.

Да, там опечатка. Вместо

 else
     {
      //--- установим для item указатель предыдущего объекта                                         
      item.prev(first);

должно быть

else
     {
      //--- установим для first указатель предыдущего объекта
      first.prev(item);
исправлено.
 

Я так и не понял про указатели и ссылки в MQL5 и теперь уже в MQL4. В чем разница передачи по ссылке и указателю кроме лишнего кода? В С++ разница есть, а тут в чем? Если не сложно напишите более развернуто.