OOP에 대한 도움말

 

나는 이 수업을 하고 있다.

 class Strategy1
{
        Strategy1();
 };

class Strategy2
{
        Strategy ( string sym);
}

이제 객체 배열을 호출하고 싶습니다.

Strategy1 S[ 10 ];   // компилируется 
Strategy2 Z( "EURUSD" )[ 10 ]; // не компилируется 

생성자에 전역 수준의 매개변수가 있는 경우 객체 배열을 빠르게 생성하는 방법은 무엇입니까?

예를 들어? 생성자를 변경하여 먼저 객체를 생성한 다음 OnInit에서 객체를 심볼로 대체하는 방법은 무엇입니까?

어쩌면 더 쉬운 해결책이 있습니까?

 

개인적으로 이런 경우에는 객체의 초기화 기능을 사용합니다.

먼저 배열이 생성되고 모든 매개변수를 설정할 수 있는 모든 배열 객체에 대해 Init() 함수가 호출됩니다.

별도의 함수로 초기화하면 객체를 재초기화할 수 있으며, 생성자에서 초기화하면 객체를 재초기화할 수 없습니다.

 
Georgiy Merts # :

개인적으로 이런 경우에는 객체의 초기화 기능을 사용합니다.

먼저 배열이 생성되고 모든 매개변수를 설정할 수 있는 배열의 모든 객체에 대해 Init() 함수가 호출됩니다.

별도의 함수로 초기화하면 객체를 재초기화할 수 있으며, 생성자에서 초기화하면 객체를 재초기화할 수 없습니다.

글쎄, 그렇게 추측했다. 고맙습니다 !

 

그리고 잠시. 포인터를 통해 개체 배열을 만드는 것이 좋습니다. 그렇지 않으면 스택 메모리에 매우 작은 배열을 얻습니다.

Strategy2 *pZ[]; 
if ( ArrayResize (pZ, 10 ) != 10 )
{
   Alert ( "Memory allocation error" );
   return ;
}

for ( int i = 0 ; i < 10 ; ++i)
{
   pZ[i] = new Strategy2( "EURUSD" ); 
   if ( CheckPointer (pZ) == POINTER_INVALID )
   {
       Alert ( "Class instantiation error" );
       return ;
   }
}
 
Ihor Herasko # :

그리고 잠시. 포인터를 통해 개체 배열을 만드는 것이 좋습니다. 그렇지 않으면 스택 메모리에 매우 작은 배열을 얻습니다.

잠재적인 문제의 예가 있으면 좋을 것입니다.

 
Ihor Herasko # :

그리고 잠시. 포인터를 통해 개체 배열을 만드는 것이 좋습니다. 그렇지 않으면 스택 메모리에 매우 작은 배열을 얻습니다.

아 그렇구나.

 
네 말도 안되는 소리입니다
 
fxsaber # :

잠재적인 문제의 예가 있으면 좋을 것입니다.

이것은 문제가 아니며 잠재적인 문제는 훨씬 적습니다. MT에서 메모리로 작업하는 기능만 있습니다. 다음은 정적 배열입니다.

 #define               ARRAY_SIZE           int ( 60000000 )
class Test
{
public :
   int                nA;
   double             fB;
   datetime           dtC;

                     Test( void )
                       : nA( 0 )
                       , fB( 1.0 )
                       , dtC( __DATETIME__ )
                     {
                     };
};

Test classTest[ARRAY_SIZE];                   // 'classTest' - global variables section is too large
 
void OnStart ()
{
}

다음은 동적 배열입니다.

 #define               ARRAY_SIZE           int ( 60000000 )
class Test
{
public :
   int                nA;
   double             fB;
   datetime           dtC;

                     Test( void )
                       : nA( 0 )
                       , fB( 1.0 )
                       , dtC( __DATETIME__ )
                     {
                     };
};

Test *pClassTest[];
 
void OnStart ()
{
   if ( ArrayResize (pClassTest, ARRAY_SIZE) != ARRAY_SIZE)
   {
       Alert ( "Not enought memory" );
       return ;
   }
   
   for ( int i = 0 ; i < ARRAY_SIZE; ++i)
   {
      pClassTest[i] = new Test();
       if ( CheckPointer (pClassTest[i]) == POINTER_INVALID )
      {
         Alert ( "Class instantiation error" );
         return ;
      }
   }

   for ( int i = 0 ; i < ARRAY_SIZE; ++i)
       delete pClassTest[i];
}

이 경우 모든 것이 컴파일되고 작동합니다.

 
Ihor Herasko # :

이것은 문제가 아니며 잠재적인 문제는 훨씬 적습니다. MT에서 메모리 작업의 기능만. 다음은 정적 배열입니다.

다음은 동적 배열입니다.

이 경우 모든 것이 컴파일되고 작동합니다.

스택은 어떻게 됩니까? 첫 번째 경우에는 컴파일 단계에서 정적으로 큰 메모리 블록을 힙에 할당하려고 시도했습니다. 이 블록에서 컴파일러로부터 이마를 받는 것이 당연했습니다. 너무 많은 메모리를 할당하거나 할당하지 않을 수 있습니다.

두 번째 경우에는 런타임에 이미 많은 메모리를 할당했습니다. 그리고 프로그램이 이미 특정 기계 리소스(메모리)로 작업하고 있기 때문에 할당이 가능한지 여부가 즉시 명확해집니다.

그리고 포인터는 무엇입니까? stat 동안 미리 정의된 두 가지 유형의 mql 배열. 컴파일 및 동적. * 포인터는 동적 배열뿐만 아니라 일반 클래스 필드도 가리킬 수 있습니다. 따라서 여기에서 포인터를 사용하는 것은 절대 정당화되지 않습니다.

추신 포인터, 클래스, 매크로와 같은 코드의 이상한 인상 - 무슨 일이 일어나고 있는지에 대한 완전한 이해 부족.

 
Ihor Herasko # :

이것은 문제가 아니며 잠재적인 문제는 훨씬 적습니다. MT에서 메모리로 작업하는 기능만 있습니다. 다음은 정적 배열입니다.

다음은 동적 배열입니다.

이 경우 모든 것이 컴파일되고 작동합니다.

이것은 올바른 예가 아니며 아무 말도하지 않는 컴파일러 제한 일뿐입니다. 개발자가 그렇게 결정한 것입니다.

두 가지 옵션이 있는 경우 하나에는 큰 정적 배열이 있고 다른 하나에는 작은 배열이 있으며 현재 프로그램이 실행 중일 때 한 가지 경우에는 예를 들어 함수를 재귀적으로 호출할 때 문제가 발생하고 다른 경우에는 문제가 발생합니다. 같은 조건에서 - 아니요. 그런 다음 갓 짜낸 주스의 위험에 대해 결론을 내릴 수 있습니다.)))

 
Vasiliy Sokolov # :

스택은 어떻습니까? 첫 번째 경우에는 컴파일 단계에서 정적으로 큰 메모리 블록을 힙에 할당하려고 시도했습니다. 이 블록에서 컴파일러로부터 이마를 받는 것이 당연했습니다. 너무 많은 메모리를 할당하거나 할당하지 않을 수 있습니다.

두 번째 경우에는 런타임에 이미 많은 메모리를 할당했습니다. 그리고 프로그램이 이미 특정 기계 리소스(메모리)로 작업하고 있기 때문에 할당이 가능한지 여부가 즉시 명확해집니다.

그리고 포인터는 무엇입니까? stat 동안 미리 정의된 두 가지 유형의 mql 배열. 컴파일 및 동적. * 포인터는 동적 배열뿐만 아니라 일반 클래스 필드도 가리킬 수 있습니다. 따라서 여기에서 포인터를 사용하는 것은 절대 정당화되지 않습니다.

추신 포인터, 클래스, 매크로와 같은 코드의 이상한 인상 - 무슨 일이 일어나고 있는지에 대한 완전한 이해 부족.

로컬 수준에서 선언하고 그렇게 끔찍하지 않은 숫자를 입력하여 예제를 약간 변경하면 컴파일러는 문제가 정확히 무엇인지에 대해 이미 일반 텍스트로 작성합니다.

 #property strict
#define               ARRAY_SIZE           int ( 140000 )

class Test
{
   
public :
   int                nA;
   double             fB;
   datetime           dtC;

                     Test( void )
                       : nA( 0 )
                       , fB( 1.0 )
                       , dtC( __DATETIME__ )
                     {
                     };
};
 
void OnStart ()
{
   Test classTest[ARRAY_SIZE];    // the size of local variables is too large
}
갑자기 Renat에서 논쟁하고 싶다면 환영 합니다.
the size of local variables is too large (more than 512kb)
the size of local variables is too large (more than 512kb)
  • 2014.02.08
  • www.mql5.com
Здравствуйте! Написал индикатор на mql4. Все работало...
사유: