GetPointer

이 함수는 개체 포인터를 반환.

void*  GetPointer(
   any_class anyobject      // 모든 클래스의 개체
   );

매개변수

anyobject

[in]  모든 클래스의 개체.

값 반환

함수는 개체 포인터를 반환.

주의

클래스 개체에만 포인터가 있습니다. 구조 및 단순 유형 변수의 인스턴스에는 포인터를 사용할 수 없습니다. 클래스 객체는 new() 연산자를 사용하여 생성되지 않지만, 예를 들어 개체 배열에서 자동으로 생성되지만, 포인터는 여전히 존재합니다. 그러나 이 포인터는 자동 타입 POINTER_AUTOMATIC이므로, delete() 연산자를 적용할 수 없습니다. 이와는 별도로, 유형 포인터는 POINTER_AUTOMATIC 유형의 동적 포인터와 다르지 않습니다.

구조 유형 및 단순 유형의 변수에는 포인터가 없으므로 GetPointer() 함수를 적용할 수 없습니다. 포인터를 함수 인수로 전달하는 것도 금지됩니다. 이 모든 경우에 컴파일러는 오류를 통지합니다.

잘못된 포인터를 호출 시도는 프로그램의 심각한 종료를 야기합니다. 그렇기 때문에 포인터를 사용하기 전에 CheckPointer()기능을 호출해야 합니다. 다음과 같은 경우 포인터가 잘못될 수 있습니다:

  • 포인터가 NULL과 같음;
  • 개체가 삭제 연산자를 사용하여 삭제.

포인터의 유효성을 검사하는 데 사용할 수 있습니다. 값이 0이 아닌 경우 포인터가 액세스에 사용될 수 있음을 보장합니다.

예를 들어:

//+------------------------------------------------------------------+
//|                                             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"
 
//+------------------------------------------------------------------+
//| 목록 요소 구현 클래스                              |
//+------------------------------------------------------------------+
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();
  };
//+------------------------------------------------------------------+
//| 시작 부분에 목록 요소를 삽입                            |
//+------------------------------------------------------------------+
bool CMyList::InsertToBegin(CItem* item)
  {
   if(CheckPointer(item)==POINTER_INVALIDreturn(false);
//---
   item.Next(m_items);
   m_items=item;
//---
   return(true);
  }
//+------------------------------------------------------------------+
//| 요소를 삭제하여 목록 삭제                           |
//+------------------------------------------------------------------+
void CMyList::Destroy()
  {
//--- 루프에서 작업할 수 있는 서비스 포인터
   CItem* item;
//--- 루프를 통과하여 동적 포인터를 삭제 시도
   while(CheckPointer(m_items)!=POINTER_INVALID)
     {
      item=m_items;
      m_items=m_items.Next();
      if(CheckPointer(item)==POINTER_DYNAMIC)
        {
         Print("동적 개체 ",item.Identifier()," 삭제됨");
         delete (item);
        }
      else Print("비동적 개체 ",item.Identifier()," 삭제될 수 없습니다");
     }
//---
  }
//+------------------------------------------------------------------+
//| 스크립트 프로그램 시작 함수                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   CMyList list;
   CItem   items[10];
   CItem*  item;
//--- 동적 개체 포인터를 만들고 목록에 추가
   item=new CItem;
   if(item!=NULL)
     {
      item.Initialize(100,"dynamic");
      item.PrintMe();
      list.InsertToBegin(item);
     }
//--- 목록에 자동 포인터를 추가
   for(int i=0; i<10; i++)
     {
      items[i].Initialize(i,"automatic");
      items[i].PrintMe();
      item=GetPointer(items[i]);
      if(CheckPointer(item)!=POINTER_INVALID)
         list.InsertToBegin(item);
     }
//--- 목록에 동적 개체 포인터를 하나 더 추가
   item=new CItem;
   if(item!=NULL)
     {
      item.Initialize(200,"dynamic");
      item.PrintMe();
      list.InsertToBegin(item);
     }
//--- 모든 목록 요소를 삭제
   list.Destroy();
//--- 모든 목록 요소는 스크립트가 끝난 후에 삭제
//--- 터미널의 전문가 탭을 참조
  }

추가 참조

개체 포인터, 개체 포인터 확인, 개체 삭제 연산자 삭제