MQL5의 OOP에 대한 질문 - 페이지 19

 
Vladimir Simakov :
예를 들어 0.15와 같이 많지는 않을 것이라고 가정합니다. 적어도 나는 그것에 대해 들어본 적이 없다. 갑자기 언제 보이면 다시 하겠습니다.

예, 이것이 가능성이 희박하다는 것은 분명하지만 항상 그렇듯이 저는 완벽한 솔루션을 원합니다)))

그래, 이게 가장 큰 문제는 아니야, 내가 스스로 문제를 만들었어... 이상적인 OOP를 원했지만, 추가 호출이 없고 모든 것이 최적이도록

이제 클래스의 5개 인스턴스를 갖고 싶지만 클래스 필드를 한 번 초기화해야 합니다. 프로그램 실행 중에 변경되지 않는 터미널 환경이 있습니다. 예제를 스케치했지만 단일 클래스 필드를 달성할 수 없습니다. 정적 또는 상속을 통한 초기화

 string          Language;

정적 문자열 언어를 선언하면; - 그러면 해결되지 않은 정적 변수 'A::Language' 오류가 발생합니다.

다음은 예입니다.

 //+------------------------------------------------------------------+
class A
  {
public :
   string          Language;
                     A() { Print ( __FUNCTION__ ); Language = TerminalInfoString ( TERMINAL_LANGUAGE ); }

  };
//+------------------------------------------------------------------+
class B: public A
  {
public :
                     B() { Print ( __FUNCTION__ ,Language); }
  };
//+------------------------------------------------------------------+
B *arrB[ 5 ];
//+------------------------------------------------------------------+
int OnInit ()
  {
   for ( int i= 0 ; i< 5 ; i++)
      arrB[i] = new B;
   return ( INIT_SUCCEEDED );
  }

이 형식에서는 문자열 Language를 최대 5회 초기화합니다. 이것은 정확하지 않으며 정적 수정자를 사용 하면 컴파일되지 않습니다.

그리고 당신은 5개의 Language 변수를 가질 필요가 없습니다!!! - 클래스 B에 있는 클래스의 인스턴스를 선언하려고 했습니다. - 동일한 5개의 변수가 있습니다. Language

2019.08.29 12:44:58.384 tst__ EURUSD,M15: 초기화됨

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::B

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::B

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::B

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::B

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::B

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:57.989 tst__ EURUSD,M30: 단위 이유 3

 
Igor Makanu :

예, 이것이 가능성이 희박하다는 것은 분명하지만 항상 그렇듯이 저는 완벽한 솔루션을 원합니다)))

그래, 이게 가장 큰 문제는 아니야, 내가 스스로 문제를 만들었어... 이상적인 OOP를 원했지만, 추가 호출이 없고 모든 것이 최적이도록

이제 클래스의 5개 인스턴스를 갖고 싶지만 클래스 필드를 한 번 초기화해야 합니다. 프로그램 실행 중에 변경되지 않는 터미널 환경이 있습니다. 예제를 스케치했지만 단일 클래스 필드를 달성할 수 없습니다. 정적 또는 상속을 통한 초기화

정적 문자열 언어를 선언하면; - 그러면 해결되지 않은 정적 변수 'A::Language' 오류가 발생합니다.

다음은 예입니다.

이 형식에서는 문자열 Language를 최대 5회 초기화합니다. 이것은 정확하지 않으며 정적 수정자를 사용 하면 컴파일되지 않습니다.

2019.08.29 12:44:58.384 tst__ EURUSD,M15: 초기화됨

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::B

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::B

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::B

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::B

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::B

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:57.989 tst__ EURUSD,M30: 단위 이유 3

 class Test
  {
private :
   static const string Language;
public :
                     Test( void ){}
                    ~Test( void ){}
  };
static const string Test::Language=:: TerminalInfoString ( TERMINAL_LANGUAGE );
 
Andrey Barinov :

알겠습니다. 이것은 옵션입니다.

하지만 이 모든 것을 하나의 클래스로 래핑하고 싶습니다. 제 예에서는 클래스 B이고 B의 5개 인스턴스를 원하지만 Language를 5번 초기화하고 싶지 않으므로 Language 변수를 갖고 싶지 않습니다. 각 인스턴스에서

불필요한 언어를 제거하는 방법?

 
Igor Makanu :

알겠습니다. 이것은 옵션입니다.

하지만 이 모든 것을 하나의 클래스로 래핑하고 싶습니다. 제 예에서는 클래스 B이고 B의 5개 인스턴스를 원하지만 Language를 5번 초기화하고 싶지 않으므로 Language 변수를 갖고 싶지 않습니다. 각 인스턴스에서

불필요한 언어를 제거하는 방법?

상속 이 형식에서는 한 번만 초기화됩니다.

 
Igor Makanu :

예, 이것이 가능성이 희박하다는 것은 분명하지만 항상 그렇듯이 저는 완벽한 솔루션을 원합니다)))

그래, 이게 가장 큰 문제는 아니야, 내가 스스로 문제를 만들었어... 이상적인 OOP를 원했지만, 추가 호출이 없고 모든 것이 최적이도록

이제 클래스의 5개 인스턴스를 갖고 싶지만 클래스 필드를 한 번 초기화해야 합니다. 프로그램 실행 중에 변경되지 않는 터미널 환경이 있습니다. 예제를 스케치했지만 단일 클래스 필드를 달성할 수 없습니다. 정적 또는 상속을 통한 초기화

정적 문자열 언어를 선언하면; - 그러면 해결되지 않은 정적 변수 'A::Language' 오류가 발생합니다.

다음은 예입니다.

이 형식에서는 문자열 Language를 최대 5회 초기화합니다. 이것은 정확하지 않으며 정적 수정자를 사용 하면 컴파일되지 않습니다.

그리고 당신은 5개의 Language 변수를 가질 필요가 없습니다!!! - 클래스 B에 있는 클래스의 인스턴스를 선언하려고 했습니다. - 동일한 5개의 변수가 있습니다. Language

2019.08.29 12:44:58.384 tst__ EURUSD,M15: 초기화됨

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::B

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::B

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::B

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::B

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::B

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:57.989 tst__ EURUSD,M30: 단위 이유 3

이제 전화에서. 저녁에 알려주시면 해결 방법을 알려 드리겠습니다.
 
Andrey Barinov :

상속 이 형식에서는 한 번만 초기화됩니다.

나를 위해 일한다

 //+------------------------------------------------------------------+
string MyTerminalInfoString()
  {
   Print ( __FUNCTION__ );
   return ( "ru" );
  }
//+------------------------------------------------------------------+
class CLang
  {
protected :
   static const string Language;
public :
                     CLang( void ) { Print ( __FUNCTION__ );}
                    ~CLang( void ) {}
  };
//+------------------------------------------------------------------+
static const string CLang::Language=MyTerminalInfoString();
//+------------------------------------------------------------------+
class B: public CLang
  {
public :
                     B() { Print ( __FUNCTION__ ,Language); }
  };
//+------------------------------------------------------------------+
B *arrB[ 5 ];
//+------------------------------------------------------------------+
int OnInit ()
  {
   for ( int i= 0 ; i< 5 ; i++)
      arrB[i] = new B;
   return ( INIT_SUCCEEDED );
  }

2019.08.29 13:24:19.690 tst__ EURUSD,M15: 초기화됨

2019.08.29 13:24:19.690 tst__ EURUSD,M15: B::Bru

2019.08.29 13:24:19.690 tst__ EURUSD,M15: CLang::CLang

2019.08.29 13:24:19.690 tst__ EURUSD,M15: B::Bru

2019.08.29 13:24:19.690 tst__ EURUSD,M15: CLang::CLang

2019.08.29 13:24:19.690 tst__ EURUSD,M15: B::Bru

2019.08.29 13:24:19.690 tst__ EURUSD,M15: CLang::CLang

2019.08.29 13:24:19.690 tst__ EURUSD,M15: B::Bru

2019.08.29 13:24:19.690 tst__ EURUSD,M15: CLang::CLang

2019.08.29 13:24:19.690 tst__ EURUSD,M15: B::Bru

2019.08.29 13:24:19.690 tst__ EURUSD,M15: CLang::CLang

2019.08.29 13:24:19.690 tst__ EURUSD,M15: MyTerminalInfoString


적어도 한 번은 MyTerminalInfoString()을 호출합니다.


일반적으로 특정 Singleton은

고맙습니다!

 
Vladimir Simakov :
이제 전화에서. 저녁에 알려주시면 해결 방법을 알려 드리겠습니다.

괜찮으시다면 괜찮습니다

그리고 Singleton 테마는 저에게 아주 새로운 것입니다. 창의성의 여지가 있습니다. 예를 들면

 
Igor Makanu :

괜찮으시다면 괜찮습니다

그리고 Singleton 테마는 저에게 아주 새로운 것입니다. 창의성의 여지가 있습니다. 예를 들면

그래서 싱글톤이나 객체에 대한 공통 필드가 필요합니까?
 
Vladimir Simakov :
그래서 싱글톤이나 객체에 대한 공통 필드가 필요합니까?

내가 원하는 것을 말하기 어렵다

나는 말로 시도 할 것입니다 :

- 나는 생성자에 의해 초기화된 클래스를 원하고 이 클래스에는 메소드가 없을 것입니다. 클래스의 작업은 주문을 열고 시나리오에 따라 주문을 몇 번 더 닫거나 다시 여는 것입니다. 유형은 열거형입니다.

- 나는 이 클래스의 인스턴스 배열을 사용할 것입니다 - 5개 이상

- 주문을 열기 위해 매번 터미널 환경을 호출하고 싶지 않으므로 SYMBOL_VOLUME_MAX, Symbol, SYMBOL_VOLUME_MIN 및 SYMBOL_VOLUME_STEP의 문자 수가 클래스에서 상수 값을 갖기를 원합니다.

- 변수의 최적 사용을 원합니다. 이전 단락의 상수를 복제하고 싶지 않습니다.


이것이 내가 모든 것을 보는 방법이지만 일반적으로 이제 작업은 클래스 자체의 올바른 구조로 축소되었습니다. 결과적으로 이미 상속해야하므로 SYMBOL_VOLUME_MAX , Symbol, SYMBOL_VOLUME_MIN ... 하나가 있습니다. 복사, 나는 여전히 오류 출력에 걸려 넘어질 것이라고 생각합니다. 그런 다음 여기에서 내 PrintLastError.mqh https://www.mql5.com/en/code/24829# 와 같이 사용할 것입니다.

 
정적 변수 , 상속 없이도 모든 인스턴스에 대해 하나가 됩니다.