OOP, mql5의 템플릿 및 매크로, 미묘함 및 사용 기술 - 페이지 26

 

질문이 있습니다:

" New Bar " 및 "Data Manager" 클래스를 사용하는 "Program" 클래스가 있습니다. "New Bar" 클래스도 "Data Manager"를 사용합니다. "Data Manager" 클래스는 공개 getter 및 setter를 구현합니다.

 class CDataManager
   {
private :
     string           m_symbol;
     ENUM_TIMEFRAMES m_timeframe;
public:
    //--- Геттеры и сеттеры
   };
class CNewBar
   {
private :
    CDataManager  m_data;
   };
class СProgram
   {
private :
    CNewBar        m_newBar;
    CDataManager   m_data;
   };

질문: 프로그램을 초기화할 때 "데이터 관리자" 클래스의 "기호" 및 "시간 프레임" 속성을 설정하기 위해 "새 막대" 클래스에 어떤 옵션이 있습니까? 데이터 관리자의 필드에 액세스하기 위해 "New Bar" 클래스에 공개 getter 및 setter를 사용하고 싶지 않습니다 . 데이터 관리자 자체가 비공개로 유지되기를 원합니다.

즉, 프로그램은 데이터 관리자를 사용하는 많은 클래스를 사용할 수 있습니다. 그리고 프로그램을 초기화할 때 모든 클래스의 모든 관리자의 필드를 필요한 값으로 초기화해야 합니다. 그러나 모든 클래스에서 데이터 관리자의 필드에 액세스하기 위해 getter를 차단하고 싶지는 않습니다. 이 같은...

 
Alexey Kozitsyn :
귀하의 설명에 따르면 이러한 설정을 별도의 엔티티로 분리하는 것이 논리적이며 모든 관리자에게 공통적입니다.
 
TheXpert :
귀하의 설명에 따르면 이러한 설정을 별도의 엔티티로 분리하는 것이 논리적이며 모든 관리자에게 공통적입니다.

예, 관리자 필드에 대한 getter가 있는 기본 클래스에서 관리자가 필요한 클래스를 상속해야 하는 것 같습니다. 고맙습니다.

 
Alexey Kozitsyn :

질문이 있습니다:

" New Bar " 및 "Data Manager" 클래스를 사용하는 "Program" 클래스가 있습니다. "New Bar" 클래스도 "Data Manager"를 사용합니다. "Data Manager" 클래스는 공개 getter 및 setter를 구현합니다.

질문: 프로그램을 초기화할 때 "데이터 관리자" 클래스의 "기호" 및 "시간 프레임" 속성을 설정하기 위해 "새 막대" 클래스에 어떤 옵션이 있습니까? 데이터 관리자의 필드에 액세스하기 위해 "New Bar" 클래스에 공개 getter 및 setter를 사용하고 싶지 않습니다 . 데이터 관리자 자체가 비공개로 유지되기를 원합니다.

즉, 프로그램은 데이터 관리자를 사용하는 많은 클래스를 사용할 수 있습니다. 그리고 프로그램을 초기화할 때 모든 클래스의 모든 관리자의 필드를 필요한 값으로 초기화해야 합니다. 그러나 모든 클래스에서 데이터 관리자의 필드에 액세스하기 위해 getter를 차단하고 싶지는 않습니다. 이 같은...

 class CDataManager
   {
private :
     string           m_symbol;
     ENUM_TIMEFRAMES m_timeframe;
public :
    CDataManager():m_symbol( _Symbol ),m_timeframe( _Period ){}
    CDataManager( string symbol, ENUM_TIMEFRAMES frame):m_symbol(symbol),m_timeframe(frame){}
     //--- Геттеры и сеттеры
   };
class CNewBar
   {
private :
    CDataManager*  m_data;
     bool            cIsDelData;
public :
   CNewBar(CDataManager* data= NULL ):m_data(!data? new CDataManager:data),cIsDelData(!data){}
   CNewBar( string symbol, ENUM_TIMEFRAMES frame):m_data( new CDataManager(symbol,frame)),cIsDelData( true ){}
  ~CNewBar() { if (cIsDelData) delete m_data;}
   };
class CProgram
   {
private :
    CNewBar        m_newBar;
    CDataManager   m_data;
public :
    CProgram():m_newBar(&m_data){}
   };

제가 하는 방법은 대략 이렇습니다.

 
Vladimir Simakov :

제가 하는 방법은 대략 이렇습니다.

예를 들어 주셔서 감사합니다. 지금은 약간 까다롭지만 전반적으로 아이디어는 명확합니다. 질문이 즉시 발생합니다. "한 수준의 중첩"인 경우 여기에는 명확하지만 여러 수준의 중첩이 있는 경우에는 어떻게 됩니까?

추가됨:

cIsDelData 필드가 왜 명확하지 않습니까? 결국 소멸자에서 POINTER_DINAMIC 에 대한 m_data를 간단히 확인할 수 있습니다. 아니면 내가 틀렸습니까?

 

상속을 하면 불필요한 메소드가 많이 나옵니다. 그리고 그 객체는 private이어야 합니다. 따라서 믿기지 않겠지만 이를 수행하는 가장 쉬운 방법은 데이터 관리자를 사용하는 모든 클래스에 대한 설정자입니다.

모든 데이터 관리자가 동일한 매개변수로 작업하는 경우 개체를 곱하지 않고 하나의 데이터 관리자에 대한 포인터를 전달하는 것이 좋습니다. 이 경우 포인터를 전달하는 데 하나의 setter만 필요합니다.

 
Alexey Kozitsyn :

예를 들어 주셔서 감사합니다. 지금은 약간 까다롭지만 전반적으로 아이디어는 명확합니다. 질문이 즉시 발생합니다. "한 수준의 중첩"인 경우 여기에는 명확하지만 여러 수준의 중첩이 있는 경우에는 어떻게 됩니까?

추가됨:

cIsDelData 필드가 왜 명확하지 않습니까? 실제로 소멸자에서 POINTER_DINAMIC에 대한 m_data를 간단히 확인할 수 있습니다. 아니면 내가 틀렸습니까?

잘못된. 동적 개체에 대한 포인터를 전달할 수 있으며, 죄송합니다. 안전하게 종료할 수 있습니다.
투자에 관해서는. 처음에 필요한 경우 개체의 인스턴스를 만든 다음 위와 유사한 포인터만 만듭니다. 프로젝트 에서 단수형을 제공한다면 싱글톤을 만들 수 있지만 mql에서는 한 번도 해본 적이 없으므로 필요하지 않습니다. 시도해야 합니다.
 
Dmitry Fedoseev :
블라디미르 시마코프 :

감사합니다. 생각해보겠습니다.

 
Vladimir Simakov :

제가 하는 방법은 대략 그렇습니다.

이 줄은 무엇을 의미합니까 CDataManager* m_data;

얘들아, 나는 이런 일을 하고 싶다. 매크로가 있다

 #define foor(a,b,v) \
for (;Funkziya(a,b,v);b++)
//я хочу доработать макрос чтобы получилось так
#define foor1(a,b,v,g) \
//за основу будет взят первый макрос
for (;Funkziya(a,b,v)&&g;b++) //эффект должен быть такой где g это дополнительное выражение которое будет дописываться в новый макрос

결과적으로, 나는 2개의 매크로 foror foor1을 갖게 될 것입니다.

 
Seric29 :

이 줄은 무엇을 의미합니까 CDataManager* m_data;

얘들아, 나는 이런 일을 하고 싶다. 매크로가 있다

결과적으로, 나는 2개의 매크로 foror foor1을 갖게 될 것입니다.

개체에 대한 포인터입니다.

불쾌하지는 않지만 그러한 매크로를 사용하면 너무 이르므로 질식할 것입니다. 먼저 내가 왜 이렇게 했는지 이해하십시오.

 #define foor1(a,b,v,g) \
for (;Funkziya(a,b,v)&&(g);(b)++)