기고글 토론 "MQL5에서 객체 포인터 사용" - 페이지 2

 

안녕하세요. 저는 초보자입니다. "*" 아이콘(별표) 사용과 관련하여 질문이 있습니다.

샘플 목록 파일에서:

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

"*"는 객체에 대한 포인터를 선언하는 데 사용되며, 이는 명확합니다.

다음:

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

"*" 기호가 어떤 용도로 사용되는지 명확하지 않습니다.

도움말에 따르면"복잡한 유형의 개체를 동적으로 만들 수 있습니다. 이것은 새 연산자의 도움으로 이루어집니다." 여기서는 새 연산자가 사용되지 않습니다. "*" 기호를 어떤 경우에 어떻게 사용할 수 있는지 자세히 설명해 주세요.

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

하지만 더 나아가

"*" 기호가 무엇을 의미하는지 명확하지 않습니다.


다음과 같이 작성할 수 있습니다.

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

차이점은 없으며 디자인 스타일과 작은 이념적 접근 방식에만 관련이 있습니다.

 
Rosh:

다음과 같이 작성할 수 있습니다.

차이점은 없으며 디자인 스타일과 작은 이념적 접근 방식에만 관련이 있습니다.

즉.

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

이것은 객체 (또는 메서드?)에 대한 포인터 선언입니다 다음 ()? 그런 다음 중괄호 안에 다음 객체 자체가 반환됩니까? 내가 올바르게 이해 했습니까?

나는 모든 것이 매우 간단해야한다는 것을 이해하지만 이전에 OOP를 접한 적이 없기 때문에 3 소나무에서 방황하고 있습니다. 제발 이해시켜주세요.

 
kogriv:

즉..

다음() 객체(또는 메서드?)에 대한 포인터를 선언하는 것이 맞나요?

다음() 함수는 CListItem 클래스의 변수에 대한 포인터를 반환한다고 말합니다.
 
kogriv:

그리고 중괄호 안에 다음 객체 자체가 반환되나요? 제가 올바르게 이해했나요?

함수 본문은 중괄호로 묶여 있습니다,

{return(next);}

이는 함수가 다음 변수를 반환한다는 의미이며, 이 변수는 CListItem 클래스의 객체에 대한 포인터 유형을 갖습니다. 이는 일반적으로 함수의 유형과 일치합니다.

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

첫 번째 예제 바로 뒤에 " pstatus 변수는 객체의 포인터이지만 연산자를 사용하여 객체 자체를 만드는 것을 의도적으로 "잊고" PrintStatus() 함수에 매개 변수로 전달했습니다 ."라는 문구가 포함되어 있습니다.

1. 포인터와 객체 중 정확히 누구에게 전달되었는지 불분명합니다.

2. 예제에는 PrintStatus() 함수가 없습니다.

[삭제]  

오류가 있는 것 같아요:

//+------------------------------------------------------------------+
//| 목록에 항목 추가하기|
//+------------------------------------------------------------------+
CList::addItem(CListItem *item)
  {
//--- 먼저 전달된 포인터의 정확성을 확인합니다.
   if(CheckPointer(item)==POINTER_INVALID) return;
//--- 목록의 항목 수를 늘립니다.
   m_counter++;
//--- 목록에 아직 항목이 없는 경우
   if(CheckPointer(first)!=POINTER_DYNAMIC)
     {
      first=item;
     }
   else
     {
      //--- 항목을 이전 개체의 포인터로 설정합니다.----------------------- 오류 시작-----------------------
      item.prev(first);
      //--- 현재 첫 번째 요소의 포인터를 기억하세요.
      CListItem *p=first;
      //--- 첫 번째 항목 대신 들어오는 항목을 넣습니다.
      first=item;
      //--- 목록의 첫 번째 요소에 대한 다음 객체의 포인터를 설정합니다.
      first.next(p);
     }
  } 
새 목록 요소에 이전 요소가 있고 두 번째 요소를 먼저 참조하는 것으로 보이며 두 번째 요소는 첫 번째 요소에 대한 참조를 얻지 못합니다.
 
Yedelkin:

첫 번째 예제 바로 뒤에 " pstatus 변수는 객체 포인터이지만 연산자로 객체 자체를 만드는 것을 의도적으로 "잊어버리고" PrintStatus() 함수에 매개 변수로 전달했습니다 ."라는 문구가 포함되어 있습니다.

1. 정확히 전달된 것이 포인터인지 객체인지 불분명합니다.

2. 예제에는 PrintStatus() 함수가 없습니다.

안 하는 것보다는 늦는 것이 낫습니다. 고마워요, 문서에서 수정했습니다. 문장의 끝이 제거되었습니다.

첫 번째 예제 바로 뒤에 " pstatus 변수는 객체의 포인터이지만 연산자를 사용하여 객체 자체를 만드는 것을 의도적으로 "잊어버리고" 이를 PrintStatus() 함수에 매개 변수로 전달했습니다 " 라는 문구가 포함되어 있습니다.

 
220Volt:

오류가 있는 것 같아요:

새 목록 요소에 이전 요소와 첫 번째 요소가 있고 두 번째 요소는 첫 번째 요소에 대한 참조를 얻지 못하는 것 같습니다.

예, 오타가 있습니다. 대신

 else
     {
      //--- 설정 항목  указатель предыдущего объекта                                         
      item.prev(first);

대신

else
     {
      //--- 첫 번째로 설정 указатель предыдущего объекта
      first.prev(item);
로 수정되었습니다.
[삭제]  

MQL5와 현재 MQL4의 포인터와 참조에 대해 여전히 이해하지 못합니다. 추가 코드를 제외하고 참조와 포인터로 전달하는 것의 차이점은 무엇인가요? C++에는 차이가 있지만 여기에는 무엇이 있습니까? 어렵지 않다면 더 자세한 정보를 적어주세요.