GetPointer

Fonksiyon nesne işaretçisine dönüş yapar.

void*  GetPointer(
   any_class anyobject      // herhangi bir sınıf nesnesi
   );

Parametreler

anyobject

[in]  Herhangi bir sınıfın nesnesi.

Dönüş değeri

Fonksiyon nesne işaretçisine dönüş yapar.

Not

Sadece sınıf nesnelerinin işaretçileri vardır. Yapıların örneklerinin ve basit tipli değişkenlerin işaretçisi olamaz. new() operatörü ile oluşturulmamış bir nesne, örneğin otomatik olarak nesneler dizisinde oluşturulmuş bir nesne, yine de bir şekillendiriciye sahiptir. Ama bu işaretçi POINTER_AUTOMATIC otomatik tipinde olacaktır, bu yüzden delete() operatörü buna uygulanamaz. Bunun yanında, tip işaretçisi, POINTER_AUTOMATIC tipinin dinamik işaretçilerinden farklı değildir.

Yapı tipi ve basit tipli değişkenler işaretçilere sahip olmadıklarından, GetPointer() fonksiyonunu bunlara uygulamak yasaklanmıştır. İşaretçinin fonksiyon argümanı olarak geçirilmesi de yasaklanmıştır. Bu durumların hiç birinde derleyici hata uyarısı yapmaz.

Yanış işaretçinin çağrılmasının denenmesi, programda kritik sonlanmaya yol açar. Bu yüzden, bir işaretçi kullanmadan önce CheckPointer() fonksiyonu çağrılmalıdır. Bir işaretçi şu durumlarda geçersiz olabilir:

  • işaretçi değeri NULL değerine eşittir;
  • nesne, delete operatörü ile silinmiştir.

Bu fonksiyon işaretçinin geçerliliğini kontrol etmek için kullanılır. Sıfır harici bir değer, işaretçinin erişim için kullanılabileceğini garanti eder.

Örnek:

//+------------------------------------------------------------------+
//|                                             Check_GetPointer.mq5 |
//|                        Copyright 2009, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2009, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
 
//+------------------------------------------------------------------+
//| Liste elemanını uygulayan sınıf                                  |
//+------------------------------------------------------------------+
class CItem
  {
   int               m_id;
   string            m_comment;
   CItem*            m_next;
public:
                     CItem() { m_id=0; m_comment=NULL; m_next=NULL; }
                    ~CItem() { Print("nin yıkıcısı ",m_id,
                                     (CheckPointer(GetPointer(this))==POINTER_DYNAMIC)?
                                     "dinamik":"dinamik değil"); }
   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; }
  };
//+------------------------------------------------------------------+
//| Listenin basit sınıfı                                            |
//+------------------------------------------------------------------+
class CMyList
  {
   CItem*            m_items;
public:
                     CMyList() { m_items=NULL; }
                    ~CMyList() { Destroy(); }
    bool             InsertToBegin(CItem* item);
    void             Destroy();
  };
//+------------------------------------------------------------------+
//| Liste elemanını başa yerleştirme                                 |
//+------------------------------------------------------------------+
bool CMyList::InsertToBegin(CItem* item)
  {
   if(CheckPointer(item)==POINTER_INVALIDreturn(false);
//---
   item.Next(m_items);
   m_items=item;
//---
   return(true);
  }
//+------------------------------------------------------------------+
//| Liste elemanlarını silerek silme                                 |
//+------------------------------------------------------------------+
void CMyList::Destroy()
  {
//--- döngüde çalışması için işaretçiyi servis et
   CItem* item;
//--- döngüyü incele ve dinamik işaretçileri sil
   while(CheckPointer(m_items)!=POINTER_INVALID)
     {
      item=m_items;
      m_items=m_items.Next();
      if(CheckPointer(item)==POINTER_DYNAMIC)
        {
         Print("Dinamik nesne ",item.Identifier()," silinecek");
         delete (item);
        }
      else Print("Dinamik olmayan nesne ",item.Identifier()," silinemez");
     }
//---
  }
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   CMyList list;
   CItem   items[10];
   CItem*  item;
//--- bir dinamik nesne işaretçisi oluştur ve listeye ekle
   item=new CItem;
   if(item!=NULL)
     {
      item.Initialize(100,"dynamik");
      item.PrintMe();
      list.InsertToBegin(item);
     }
//--- listeye otomatik işaretçiler ekle
   for(int i=0; i<10; i++)
     {
      items[i].Initialize(i,"otomatik");
      items[i].PrintMe();
      item=GetPointer(items[i]);
      if(CheckPointer(item)!=POINTER_INVALID)
         list.InsertToBegin(item);
     }
//--- listenin başına bir yada daha fazla dinamik nesne ekle
   item=new CItem;
   if(item!=NULL)
     {
      item.Initialize(200,"dynamik");
      item.PrintMe();
      list.InsertToBegin(item);
     }
//--- tüm liste elemanlarını sil
   list.Destroy();
//--- script bittikten sonra tüm liste elemanları silinecek
//--- terminaldeki Uzmanlar sekmesine bak
  }

Ayrıca Bakınız

Nesne İşaretçileri, Nesne İşaretçisinin Kontrolü, Nesne Silme Operatörü delete