"Nesne işaretleyicilerini MQL5'te Kullanma" makalesi için tartışma - sayfa 2

 

İyi günler. Ben yeni başlayan biriyim. "*" simgesinin (yıldız işareti) kullanımıyla ilgili bir sorum var.

Samplelist dosyasında:

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

"*" bir nesneye işaretçi bildirmek için kullanılır - bu biraz açık.

Sonraki:

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

"*" işaretinin ne için kullanıldığı açık değildir.

Yardıma göre,"karmaşık tipte nesneleri dinamik olarak oluşturmak mümkündür. Bu, new operatörünün yardımıyla yapılır." new operatörü burada kullanılmıyor. Lütfen "*" işaretinin nasıl ve hangi durumlarda kullanılabileceğini daha ayrıntılı olarak açıklayın.

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

Dahası da var:

Burada yer alan "*" işaretinin ne anlama geldiği açık değildir.


Şöyle yazabilirsiniz

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

Hiçbir fark olmayacak, sadece tasarım tarzı ve küçük bir ideolojik yaklaşım söz konusu.

 
Rosh:

Bunu şu şekilde yazabilirsiniz

Hiçbir fark olmayacak, sadece tasarım tarzı ve küçük bir ideolojik yaklaşımla ilgili.

Yani.

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

bu, next() nesnesine (veya yöntemine?) bir işaretçi bildirimi mi? Ve sonra, küme parantezleri içinde, sonraki nesnenin kendisi döndürülür? Doğru anladım mı?

Her şeyin çok basit olması gerektiğini anlıyorum ama daha önce OOP ile karşılaşmadığım için 3 çamda bir derede dolaşıyorum. Lütfen anlamamı sağlayın.

 
kogriv:

Yani.

next() nesnesine (veya yöntemine?) bir işaretçi bildirimi midir?

next() fonksiyonunun CListItem sınıfının bir değişkenine bir işaretçi döndürdüğünü söylüyor.
 
kogriv:

Ve sonra, küme parantezleri içinde, bir sonraki nesnenin kendisi döndürülür? Doğru mu anladım?

Fonksiyonun gövdesi küme parantezleri içinde verilir,

{return(next);}

fonksiyonun, CListItem sınıfının bir nesnesine işaretçi türünde olan next değişkenini döndüreceği anlamına gelir. Bu genellikle fonksiyonun türüyle uyumludur.

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

İlk örnekten hemen sonra, makalede "p status değişkeni bir nesnenin işaretçisidir, ancak new operatörünü kullanarak nesnenin kendisini oluşturmayı kasıtlı olarak "unuttuk" ve PrintStatus() fonksiyonuna bir parametre olarak aktardık " ifadesi yer almaktadır.

1. "Tam olarak" neyi geçirdiğiniz belli değil - bir işaretçi mi yoksa bir nesne mi?

2. Örnekte PrintStatus() fonksiyonu bulunmamaktadır.

 

Sanırım bir hata var:

//+------------------------------------------------------------------+
//| listeye bir öğe ekleme|
//+------------------------------------------------------------------+
CList::addItem(CListItem *item)
  {
//--- önce aktarılan işaretçinin doğruluğunu kontrol edin
   if(CheckPointer(item)==POINTER_INVALID) return;
//--- listedeki öğe sayısını artır
   m_counter++;
//--- listede henüz öğe yoksa
   if(CheckPointer(first)!=POINTER_DYNAMIC)
     {
      first=item;
     }
   else
     {
      //--- öğeyi bir önceki nesnenin işaretçisine ayarla----------------------- Hata başlangıcı-----------------------
      item.prev(first);
      //--- geçerli ilk öğenin işaretçisini hatırla
      CListItem *p=first;
      //--- gelen öğeyi ilk öğenin yerine koy
      first=item;
      //--- listenin ilk elemanı için bir sonraki nesnenin işaretçisini ayarla
      first.next(p);
     }
  } 
Görünüşe göre yeni liste elemanı ikinci elemanı referans alan prev ve first'e sahip ve ikinci eleman ilk elemana referans almıyor.
 
Yedelkin:

İlk örnekten hemen sonra, makalede "p status değişkeni bir nesne işaretçisidir, ancak nesnenin kendisini new operatörü ile oluşturmayı kasıtlı olarak "unuttuk" ve PrintStatus() fonksiyonuna parametre olarak aktardık " ifadesi yer almaktadır.

1. Tam olarak neyin aktarıldığı belli değil - bir işaretçi mi yoksa bir nesne mi?

2. Örnekte PrintStatus() fonksiyonu bulunmamaktadır.

Geç olması hiç olmamasından iyidir. Teşekkürler, makalede düzeltildi. Cümlenin sonu kaldırıldı

İlk örnekten hemen sonra, makalede "p status değişkeni bir nesnenin işaretçisidir, ancak new operatörünü kullanarak nesnenin kendisini oluşturmayı kasıtlı olarak"unuttuk" ve PrintStatus() fonksiyonuna parametre olarak aktardık " ifadesi yer almaktadır.

 
220Volt:

Sanırım bir hata var:

Çıktı, yeni liste elemanının ikinci elemana referans veren prev ve first'e sahip olduğu ve ikinci elemanın ilk elemana referans almadığıdır.

Evet, bir yazım hatası var. Bunun yerine

 else
     {
      //--- öğeyi  ayarla  указатель предыдущего объекта                                         
      item.prev(first);

olmalı

else
     {
      //--- ilk için ayarlandı указатель предыдущего объекта
      first.prev(item);
düzeltildi.
 

MQL5'te ve şimdi MQL4'te işaretçiler ve referanslar hakkında hala bir şey anlamıyorum. Ekstra kod dışında referans ve işaretçi ile geçiş arasındaki fark nedir? C++'da bir fark var ama burada ne fark var? Eğer zor değilse lütfen daha detaylı bilgi yazınız.