Давайте вместе разберем CObject ?

 

Разбираюсь детально с ООП и никак не могу вьехать в этот код

class CObject
{
protected:
   CObject          *m_prev;
   CObject          *m_next;

public:
                     CObject();

   CObject          *Prev()                { return(m_prev); }
   void              Prev(CObject *node)   { m_prev=node;    }
   CObject          *Next()                { return(m_next); }
   void              Next(CObject *node)   { m_next=node;    }

   virtual bool      Save(int file_handle) { return(true);   }
   virtual bool      Load(int file_handle) { return(true);   }

   virtual int       Type() const          { return(0);      }

protected:
   virtual int       Compare(const CObject *node,int mode=0) const { return(0); }
};

//+------------------------------------------------------------------+
void CObject::CObject()
{
   m_prev=NULL;
   m_next=NULL;
}

Прочитал несколько статей в том чиле и эту https://www.mql5.com/ru/articles/179

и ника не могу понять, что делает этот код ?  

Может кто то простым языком и примером показать зачем этот CObject  и как он работает ?

 
Vladimir Pastushak:

Разбираюсь детально с ООП и никак не могу вьехать в этот код

Прочитал несколько статей в том чиле и эту https://www.mql5.com/ru/articles/179

и ника не могу понять, что делает этот код ?  

Может кто то простым языком и примером показать зачем этот CObject  и как он работает ?

Это класс-предок (база для потомков при наследовании), Prev() и Next() - для работы со списками, Save() и Load() - для файлов (нужно будет реализовать в классах-потомках, как и другие виртуальные методы). Не заморачивайтесь на нем, разбирайте нужные классы-потомки и все.
 
Alexey Kozitsyn:
Это класс-предок (база для потомков при наследовании), Prev() и Next() - для работы со списками, Save() и Load() - для файлов (нужно будет реализовать в классах-потомках, как и другие виртуальные методы). Не заморачивайтесь на нем, разбирайте нужные классы-потомки и все.

Я хочу понять как он работает и для чего он нужен. 

 
Vladimir Pastushak:

Я хочу понять как он работает и для чего он нужен. 

Предположу, что, когда mql5 еще не содержал функционал абстрактных классов, этот класс был основой-основ части стандартной библиотеки. Т.е. экземпляры этого класса, я считаю, не должны создаваться как таковые. Т.е. класс должен быть абстрактным. Этот класс - шаблон, основа для дальнейшего от него наследования. Вот для чего он нужен (по крайней мере, я себе это так представляю).
 
Vladimir Pastushak:

Я хочу понять как он работает и для чего он нужен. 


А что именно непонятно?

class CObject
{
protected:
   CObject          *m_prev; //Сохранили ссылку на память подобного класса в эту переменную
   CObject          *m_next;

public:
                     CObject();

   CObject          *Prev()                { return(m_prev); } //Вызвали сохраненую ссылку на память
   void              Prev(CObject *node)   { m_prev=node;    }
   CObject          *Next()                { return(m_next); }
   void              Next(CObject *node)   { m_next=node;    }

   virtual bool      Save(int file_handle) { return(true);   }
   virtual bool      Load(int file_handle) { return(true);   }

   virtual int       Type() const          { return(0);      }

protected:
   virtual int       Compare(const CObject *node,int mode=0) const { return(0); }
};

//+------------------------------------------------------------------+
void CObject::CObject()
{
   m_prev=NULL;
   m_next=NULL;
}
 
Alexandr Andreev:

А что именно непонятно?


зачем в себе делать копии себя ?

 CObject          *m_prev;
   CObject          *m_next;
 
Vladimir Pastushak:

зачем в себе делать копии себя ?


Это не копии это место под ссылку, оно изначально пустое

Ну много для чего может понадобиться

Проще понять на примере графических обьектов

Это самое оно для ООП

 
Alexandr Andreev:

Это не копии это место под ссылку, оно изначально пустое


под какую ссылку ? На что ссылается ?

 

Alexandr Andreev:

Это не копии это место под ссылку, оно изначально пустое


почему две и как их потом листать ?

 
Vladimir Pastushak:

почему две и как их потом листать ?


.... я тут стока напечатал а потом обновил случайно

сейчас приведу пример

 
class CObject
{
protected:
   CObject          *m_prev; //Сохранили ссылку на память подобного класса в эту переменную
   CObject          *m_next;

public:
                     CObject();
   int               primer;
   CObject          *Prev()                { return(m_prev); } //Вызвали сохраненую ссылку на память
   void              Prev(CObject *node)   { m_prev=node;    }
   CObject          *Next()                { return(m_next); }
   void              Next(CObject *node)   { m_next=node;    }

   virtual bool      Save(int file_handle) { return(true);   }
   virtual bool      Load(int file_handle) { return(true);   }

   virtual int       Type() const          { return(0);      }

protected:
   virtual int       Compare(const CObject *node,int mode=0) const { return(0); }
};

//+------------------------------------------------------------------+
void CObject::CObject()
{
   primer=0;
   m_prev=NULL;
   m_next=NULL;
}
Vladimir Pastushak
:


почему две и как их потом листать ?



void Init()

   {

   CObject Mars,Planeta;

   Mars.Prev(GetPointer(Planeta)); // Теперь в классе Марс есть клас Планета если он будет не протект то мы могли бы на него ссылаться прям с этой же функции

   CObject *Planeta2=Mars.Prev(); // А тут извлекли планету в планета2, вся суть в том что изменяя планету 2 мы одновремено меняем и планету т.к. по факту ссылаемся на один и тот же участок памяти

   }

Это будет очень заметно если в этот класс добавить 

class CObject
{
protected:
   CObject          *m_prev; //Сохранили ссылку на память подобного класса в эту переменную
   CObject          *m_next;

public:
                     CObject();
   int               primer;
   CObject          *Prev()                { return(m_prev); } //Вызвали сохраненую ссылку на память
   void              Prev(CObject *node)   { m_prev=node;    }
   CObject          *Next()                { return(m_next); }
   void              Next(CObject *node)   { m_next=node;    }

   virtual bool      Save(int file_handle) { return(true);   }
   virtual bool      Load(int file_handle) { return(true);   }

   virtual int       Type() const          { return(0);      }

protected:
   virtual int       Compare(const CObject *node,int mode=0) const { return(0); }
};

//+------------------------------------------------------------------+
void CObject::CObject()
{
   primer=0;
   m_prev=NULL;
   m_next=NULL;
}
Причина обращения: