Вопросы по ООП (Объектно Ориентированному Программированию ) - страница 8

 
C-4:
Typeid() к сожалению нет, а сила шаблонов в статической идентификации. Разные задачи решаются разными методами и говорить что один метод бяка, а другой хорош - агульное допущение.

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

Но тоже беда. Что-то с VS 2012 изменилось в STL (string) и, начиная с неё, не компилируется. Не разбирался ещё.

 
Pavlick:

Х.з, не указатели, а смех на палке.


На странице по второй ссылке в моем посте написано:

В MQL4 существует возможность динамически создавать объекты сложного типа. Это делается при помощи оператора new, который возвращает описатель созданного объекта.

Описатель имеет размер 8 байт. Синтаксически описатели объектов в MQL4 похожи на указатели в C++.

Примеры:

MyObject* hobject= new MyObject();

Еще раз повторим, что в отличие от C++, переменная hobject из вышеприведенного примера не является указателем на память, а является дескриптором объекта.


 
EverAlex:

На странице по второй ссылке в моем посте написано:

В MQL4 существует возможность динамически создавать объекты сложного типа. Это делается при помощи оператора new, который возвращает описатель созданного объекта.

Описатель имеет размер 8 байт. Синтаксически описатели объектов в MQL4 похожи на указатели в C++.

Примеры:

MyObject* hobject= new MyObject();

Еще раз повторим, что в отличие от C++, переменная hobject из вышеприведенного примера не является указателем на память, а является дескриптором объекта.

Товарищ mql5 внес ясность здесь https://www.mql5.com/ru/forum/150943/page6#950107 . Я по незнанию погорячился.
 

Не ранее как вчера я задал в тех. поддержку вопрос касательно отделения файла с реализацией класса от файла-интерфейса. И получил ответ:

В MQL нет файла проекта, фактически им выступает mq4 файл, а программа обязана иметь точки входа (при их отсутствии выдаётся ошибка "event handling function not found"). Поэтому при разделении интерфейса от реализации класса, файлом-реализации и интерфейса должны быть mqh файлы.

 Суть такая, что это по сути является не логичным вариантом. Ведь файл с реализацией класса на то он и и файл с реализацией, чтобы его защищать от клиентов. А если и то и то в открытом виде, т.е. в формате .mqh, то зачем тогда вообще это делать?

 
hoz:

Не ранее как вчера я задал в тех. поддержку вопрос касательно отделения файла с реализацией класса от файла-интерфейса. И получил ответ:

Суть такая, что это по сути является не логичным вариантом. Ведь файл с реализацией класса на то он и и файл с реализацией, чтобы его защищать от клиентов. А если и то и то в открытом виде, т.е. в формате .mqh, то зачем тогда вообще это делать?

Никогда не разделяю объявление от реализации. Всё пишу в заголовочном файле. Это значительнее удобнее. Надо следить за одним файлом, а не за двумя. Хорошо ещё, если в классе всего три метода. А, если 100? Замучаешься сравнивать два файла. В одном напишешь, в другом забудешь и др...

Есть только один случай, когда надо разделить. Это, когда два и более классов взаимно ссылаются друг на друга. Надо бы избегать таких решений. Это касается С++. В MQL не знаю, как это делается.

 

 В учебнике, а в частности вот коды:

//+------------------------------------------------------------------+
//| Класс, реализующий элемент списка                                |
//+------------------------------------------------------------------+
class CItem
  {
   int               m_id;
   string            m_comment;
   CItem*            m_next;
public:
                     CItem() { m_id=0; m_comment=NULL; m_next=NULL; }
                    ~CItem() { Print("Destructor of ",m_id,
                                     (CheckPointer(GetPointer(this))==POINTER_DYNAMIC)?
                                     "dynamic":"non-dynamic"); }
   void              Initialize(int id,string comm) { m_id=id; m_comment=comm; }
   void              PrintMe() { Print(__FUNCTION__,":",m_id,m_comment); }
   int               Identifier() { return(m_id); }
   CItem*            Next() {return(m_next); }
   void              Next(CItem *item) { m_next=item; }
  };
//+------------------------------------------------------------------+
//| Простейший класс списка                                          |
//+------------------------------------------------------------------+
class CMyList
  {
   CItem*            m_items;
public:
                     CMyList() { m_items=NULL; }
                    ~CMyList() { Destroy(); }
    bool             InsertToBegin(CItem* item);
    void             Destroy();
  };

Имеются такие поля:

void              Next(CItem *item) { m_next=item; }

 bool             InsertToBegin(CItem* item);
Почему знак * в одном случае справа, а в другом - слева?
 
hoz:

В учебнике, а в частности вот коды:

Имеются такие поля:

Почему знак * в одном случае справа, а в другом - слева?

Так написано. Это неважно.

Сам пишу оператор "*" для обозначения указателя рядом с типом справа от него (int*), а при разыменовании рядом с переменной слева от неё (*pnVal).

 
Zhunko:

Так написано. Это неважно.

Сам пишу оператор "*" для обозначения указателя рядом с типом справа от него (int*), а при разыменовании рядом с переменной слева от неё (*pnVal).

Я так и думал. Видать невнимательный программист писал пример.

Есть там ещё странные вещи:

 CItem*            m_next;

Это значит что классу CItem присваивается описатель объекта m_next?

 
hoz:

В учебнике, а в частности вот коды:

Имеются такие поля:

Почему знак * в одном случае справа, а в другом - слева?

Он не слева и не справа, он между.
 
hoz:

Я так и думал. Видать невнимательный программист писал пример.

Есть там ещё странные вещи:

Это значит что классу CItem присваивается описатель объекта m_next?


Это значит надо будет создавать экземпляр оператором new.