OOP(객체 지향 프로그래밍)에 대한 질문 - 페이지 8

 
C-4 :
Typeid()는 불행히도 그렇지 않으며 템플릿의 힘은 정적 식별에 있습니다. 다른 작업은 다른 방법으로 해결되며 한 방법은 나쁘고 다른 방법은 좋다고 말하는 것은 민첩한 가정입니다.

동적 식별이 필요한 경우가 있었습니다. 유니버셜 타입을 제외하고는 모든 솔루션이 매우 번거로웠습니다. 제네릭 유형을 구현하는 클래스를 통해 만들어집니다.

하지만 문제이기도 합니다. VS 2012 이후 STL(문자열)에서 무언가가 변경되었으며 거기에서 시작하여 컴파일되지 않습니다. 아직 알아내지 못했습니다.

 
Pavlick :

X는 포인터가 아니라 막대기 위의 웃음입니다.


내 게시물의 두 번째 링크 페이지에는 다음과 같이 나와 있습니다.

MQL4에서는 복잡한 유형의 객체를 동적으로 생성할 수 있습니다. 이것은 생성된 객체에 대한 핸들을 반환하는 new 연산자를 사용하여 수행됩니다.

디스크립터의 크기 는 8바이트 입니다. 구문적으로 MQL4의 객체 설명자는 C++의 포인터와 유사합니다.

예:

MyObject* hobject= new MyObject();

다시 말하지만, C++와 달리 위 예제hobject 변수 는 메모리에 대한 포인터가 아니라 객체에 대한 핸들입니다.


 
EverAlex :

내 게시물의 두 번째 링크 페이지에는 다음과 같이 나와 있습니다.

MQL4에서는 복잡한 유형의 객체를 동적으로 생성할 수 있습니다. 이것은 생성된 객체에 대한 핸들을 반환하는 new 연산자를 사용하여 수행됩니다.

디스크립터의 크기 는 8바이트 입니다. 구문적으로 MQL4의 객체 설명자는 C++의 포인터와 유사합니다.

예:

MyObject* hobject= new MyObject();

다시 한 번 말씀드리지만 C++와 달리 위 예제hobject 변수 는 메모리에 대한 포인터가 아니라 객체에 대한 핸들입니다.

mql5 동지는 여기 https://www.mql5.com/ru/forum/150943/page6#950107 에 설명되어 있습니다 . 나도 모르게 흥분했다.
 

어제보다 빠르지 않은 시간에 나는 그들에게 물었다. 인터페이스 파일에서 클래스 구현 파일의 분리에 관한 지원 질문입니다. 그리고 답을 얻었습니다.

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

결론은 이것이 본질적으로 논리적인 옵션이 아니라는 것입니다. 결국 클래스가 구현된 파일은 그대로이고 클라이언트로부터 보호하기 위해 구현된 파일입니다. 그리고 이것과 저것이 모두 공개되어 있다면, 즉 .mqh 형식으로 되어 있는데 왜 그렇게 합니까?

 
hoz :

어제보다 빠르지 않아 나는 그것들에 물었다. 인터페이스 파일에서 클래스 구현 파일의 분리에 관한 지원 질문입니다. 그리고 답을 얻었습니다.

결론은 이것이 본질적으로 논리적인 옵션이 아니라는 것입니다. 결국 클래스가 구현된 파일은 그대로이고 클라이언트로부터 보호하기 위해 구현된 파일입니다. 그리고 이것과 저것이 모두 공개되어 있다면, 즉 .mqh 형식으로 되어 있는데 왜 그렇게 합니까?

선언과 구현을 분리하지 마십시오. 헤더 파일에 모든 것을 씁니다. 이것은 훨씬 더 편리합니다. 두 개가 아닌 하나의 파일을 추적해야 합니다. 클래스에 메서드가 3개만 있으면 좋습니다. 100이면? 당신은 두 파일을 비교하는 데 괴로워합니다. 하나는 쓰고 다른 하나는 잊어버리고...

나누어야 하는 경우는 딱 한 가지입니다. 이것은 둘 이상의 클래스가 서로를 참조하는 경우입니다. 그러한 결정은 피해야 합니다. 이것은 C++에 관한 것입니다. MQL에서는 어떻게 되는지 모르겠습니다.

 

튜토리얼 에서 특히 다음은 코드입니다.

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

다음 필드가 있습니다.

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

 bool             InsertToBegin(CItem* item);
한 경우에는 오른쪽 에, 다른 경우에는 왼쪽* 기호가 있는 이유는 무엇입니까?
 
hoz :

튜토리얼 에서 특히 다음은 코드입니다.

다음 필드가 있습니다.

한 경우에는 오른쪽 에, 다른 경우에는 왼쪽* 기호가 있는 이유는 무엇입니까?

그렇게 쓰여 있습니다. 그것은 중요하지 않습니다.

내가 직접 "*" 연산자를 작성하여 형식의 오른쪽(int*) 옆에 포인터를 지정하고 왼쪽의 변수 옆을 역참조할 때(*pnVal) 지정합니다.

 
Zhunko :

그렇게 쓰여 있습니다. 그것은 중요하지 않습니다.

내가 직접 "*" 연산자를 작성하여 형식의 오른쪽(int*) 옆에 포인터를 지정하고 왼쪽의 변수 옆을 역참조할 때(*pnVal) 지정합니다.

나는 그렇게 생각했다. 부주의한 프로그래머가 예제를 작성한 것 같습니다.

거기에는 다른 이상한 것들이 있습니다.

 CItem*            m_next;

이것은 CItem 클래스 에 개체 핸들 m_next 가 할당되었음을 의미합니까?

 
hoz :

튜토리얼 에서 특히 다음은 코드입니다.

다음 필드가 있습니다.

한 경우에는 오른쪽 에, 다른 경우에는 왼쪽* 기호가 있는 이유는 무엇입니까?

그는 왼쪽에 있지 않고 오른쪽에 있지 않고 그 사이에 있습니다.
 
hoz :

나는 그렇게 생각했다. 부주의한 프로그래머가 예제를 작성한 것 같습니다.

거기에는 다른 이상한 것들이 있습니다.

이것은 CItem 클래스에 개체 핸들 m_next 가 할당되었음을 의미합니까?


이것은 new 연산자 를 사용하여 인스턴스를 생성해야 함을 의미합니다.