OOP (Nesneye Yönelik Programlama) hakkında sorular - sayfa 8

 
C-4 :
Typeid() maalesef değil ve şablonların gücü statik tanımlamada. Farklı görevler farklı yöntemlerle çözülür ve bir yöntemin kötü, diğerinin iyi olduğunu söylemek çevik bir varsayımdır.

Dinamik tanımlamaya ihtiyacım olduğunda bir vakam vardı. Evrensel tip dışında tüm çözümler çok hantaldı. Genel bir tür uygulayan bir sınıf aracılığıyla yapılmıştır.

Ama aynı zamanda bir problem. VS 2012'den bu yana STL'de (string) bir şeyler değişti ve oradan başlayarak derlenmeyecek. Henüz çözemedim.

 
Pavlick :

X'ler, işaretçiler değil, bir sopayla kahkahalar.


Gönderimdeki ikinci bağlantıdaki sayfada şöyle diyor:

MQL4'te karmaşık tipte nesneleri dinamik olarak oluşturmak mümkündür. Bu, oluşturulan nesneye bir tanıtıcı döndüren new operatörü kullanılarak yapılır.

Tanımlayıcının boyutu 8 bayttır . Sözdizimsel olarak, MQL4'teki nesne tanımlayıcıları, C++'daki işaretçilere benzer.

Örnekler:

MyObject* hobject= new MyObject();

Yine, C++' dan farklı olarak, yukarıdaki örnekteki hobject değişkeni, belleğe bir işaretçi değil , bir nesnenin tanıtıcısıdır.


 
EverAlex :

Yazımdaki ikinci bağlantıdaki sayfada şöyle diyor:

MQL4'te karmaşık tipte nesneleri dinamik olarak oluşturmak mümkündür. Bu, oluşturulan nesneye bir tanıtıcı döndüren new operatörü kullanılarak yapılır.

Tanımlayıcının boyutu 8 bayttır . Sözdizimsel olarak, MQL4'teki nesne tanımlayıcıları, C++'daki işaretçilere benzer.

Örnekler:

MyObject* hobject= new MyObject();

Yine, C++' dan farklı olarak, yukarıdaki örnekteki hobject değişkeni, belleğe bir işaretçi değil , bir nesnenin tanıtıcısıdır.

Yoldaş mql5 burada açıklığa kavuşturuldu https://www.mql5.com/ru/forum/150943/page6#950107 . Farkında olmadan heyecanlandım.
 

Dünden daha erken değil, bunları sordum. sınıf uygulama dosyasının arayüz dosyasından ayrılmasıyla ilgili destek sorusu. Ve cevabı aldı:

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

Sonuç olarak, bu aslında mantıklı bir seçenek değil. Ne de olsa, sınıfın uygulandığı dosya, onu istemcilerden korumak için uygulamanın olduğu dosyadır. Ve hem bu hem de bu açıksa, yani. .mqh biçiminde, o zaman neden bunu yapıyorsunuz?

 
hoz :

Dünden daha erken değil, bunları sordum. sınıf uygulama dosyasının arayüz dosyasından ayrılmasıyla ilgili destek sorusu. Ve cevabı aldı:

Sonuç olarak, bu aslında mantıklı bir seçenek değil. Ne de olsa, sınıfın uygulandığı dosya, onu istemcilerden korumak için uygulamanın olduğu dosyadır. Ve hem bu hem de bu açıksa, yani. .mqh biçiminde, öyleyse neden bunu yapıyorsunuz?

Bildirimi asla uygulamadan ayırmayın. Her şeyi başlık dosyasına yazarım. Bu çok daha uygun. İki dosyayı değil, bir dosyayı takip etmeniz gerekiyor. Sınıfta yalnızca üç yöntem olması iyidir. 100 olursa ne olur? İki dosyayı karşılaştırmak için eziyet çekiyorsun. Birinde yaz, diğerinde unut, vb...

Bölmenin gerekli olduğu tek bir durum vardır. Bu, iki veya daha fazla sınıfın karşılıklı olarak birbirine başvurduğu zamandır. Bu tür kararlardan kaçınılmalıdır. Bu, C++ ile ilgilidir. MQL'de bunun nasıl yapıldığını bilmiyorum.

 

Öğreticide ve özellikle burada kodlar:

 //+------------------------------------------------------------------+
//| Класс, реализующий элемент списка                                |
//+------------------------------------------------------------------+
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();
  };

Aşağıdaki alanlar vardır:

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

 bool             InsertToBegin(CItem* item);
* işareti neden bir durumda sağda , diğerinde solda ?
 
hoz :

Öğreticide ve özellikle burada kodlar:

Aşağıdaki alanlar vardır:

* işareti neden bir durumda sağda , diğerinde solda ?

Böyle yazılır. Önemli değil.

Ben kendim "*" operatörünü, sağındaki türün yanında (int*) ve solundaki değişkenin yanında başvuruyu kaldırırken (*pnVal) bir işaretçi belirlemek için yazıyorum.

 
Zhunko :

Böyle yazılır. Önemli değil.

Ben kendim "*" operatörünü, sağındaki türün yanında (int*) ve solundaki değişkenin yanında başvuruyu kaldırırken (*pnVal) bir işaretçi belirlemek için yazıyorum.

Ben de öyle düşünmüştüm. Dikkatsiz bir programcı bir örnek yazmış gibi görünüyor.

Orada başka garip şeyler de var:

 CItem*            m_next;

Bu, CItem sınıfına m_next nesne tanıtıcısının atandığı anlamına mı geliyor?

 
hoz :

Öğreticide ve özellikle burada kodlar:

Aşağıdaki alanlar vardır:

* işareti neden bir durumda sağda , diğerinde solda ?

Sağda ve solda değil, arada kalıyor.
 
hoz :

Ben de öyle düşünmüştüm. Dikkatsiz bir programcı bir örnek yazmış gibi görünüyor.

Orada başka garip şeyler de var:

Bu, CItem sınıfına m_next nesne tanıtıcısının atandığı anlamına mı geliyor?


Bu , new operatörüyle bir örnek oluşturmanın gerekli olacağı anlamına gelir.