Скачать MetaTrader 5

Константный указатель

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Язык MQL5 поддерживает технологию OpenCL. Попробуй сам!
Комбинатор
15924
Комбинатор 2011.06.30 00:48 

... это из разряда фантастики? Если нет, как его сделать?

конструкция Object * const ptr = ... не проканывает. Это же важная часть инкапсуляции!

Vladimir Kustikov
1587
Vladimir Kustikov 2011.06.30 09:52  
TheXpert:

... это из разряда фантастики? Если нет, как его сделать?

конструкция Object * const ptr = ... не проканывает. Это же важная часть инкапсуляции!

А подскажите чайнику - в чем тайный смысл использования константных указателей, и как это относится к инкапсуляции?

Накидал пример:

class CType
  {
 public:
   int value;
  };


void OnStart()
  {
   CType* a;
   a=new CType;
   a.value = 10;

   const CType* b = GetPointer(a);
  
   Print("b=", b.value);

   //b=a;             // ошибка, изменить указатель нельзя
   //b.value=30;      // ошибка, данные изменить тоже нельзя..

   CType* c;
   c=new CType;  
   c = GetPointer(b);
  
   c.value=70;        // а вот так данные изменить можно

   Print("b=", b.value);
   
   delete a;
   delete c;
  };

 

Комбинатор
15924
Комбинатор 2011.06.30 11:36  
Vladix:

А подскажите чайнику - в чем тайный смысл использования константных указателей, и как это относится к инкапсуляции?


Вот пример:

class Manager
{
public:
   void Action()
   {}

   Manager* const Get()
   {
      return GetPointer(this);
   }
};

Manager* GetManager()
{
   static Manager theManager;
   return theManager.Get();
}

void OnTick()
{
   GetManager().Action();
}

Если бы был чистый константный указатель, пример бы работал.

А т.к. константность совмещенная, нельзя безопасно передать указатель на неконстантный объект.



Dmitriy Skub
11626
Dmitriy Skub 2011.06.30 11:53  
TheXpert:

... это из разряда фантастики? Если нет, как его сделать?

конструкция Object * const ptr = ... не проканывает. Это же важная часть инкапсуляции!

Мож так будет лучше?

const Object* ptr =...

Комбинатор
15924
Комбинатор 2011.06.30 11:56  
Dima_S:

Мож так будет лучше?

const Object* ptr =...

А почитать? Мне не нужен указатель на константу, мне нужен константный указатель на неконстанту.
Dmitriy Skub
11626
Dmitriy Skub 2011.06.30 12:02  
TheXpert:
А почитать? Мне не нужен указатель на константу, мне нужен константный указатель на неконстанту.
Вообще-то данный модификатор ставится перед типом, а не после. Но, если Вы настаиваете, то я удаляюсь.
Vladimir Kustikov
1587
Vladimir Kustikov 2011.06.30 13:05  
TheXpert:


Вот пример:

Если бы был чистый константный указатель, пример бы работал.

А т.к. константность совмещенная, нельзя безопасно передать указатель на неконстантный объект.


А какие проблемы безопасности решил бы константный указатель в приведенном вами примере?

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

Комбинатор
15924
Комбинатор 2011.06.30 13:13  

Тема снимается. Был неправ, извините.

Замена константного указателя -- использование POINTER_AUTOMATIC.

Документация по MQL5: Стандартные константы, перечисления и структуры / Именованные константы / Проверка указателя объекта
Документация по MQL5: Стандартные константы, перечисления и структуры / Именованные константы / Проверка указателя объекта
  • www.mql5.com
Стандартные константы, перечисления и структуры / Именованные константы / Проверка указателя объекта - Документация по MQL5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий