OOP ile ilgili yardım

 

ben bu sınıfı yapıyorum

 class Strategy1
{
        Strategy1();
 };

class Strategy2
{
        Strategy ( string sym);
}

Şimdi bir dizi nesneyi çağırmak istiyorum:

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

Yapıcı global düzeyde parametrelere sahipse, hızlı bir şekilde bir dizi nesne nasıl oluşturulur?

Örneğin? önce yapıcıyı değiştirerek nesneler oluşturun ve ardından OnInit'teki nesneleri sembollerle olacak şekilde nasıl değiştirebilirim?

Belki daha kolay bir çözüm vardır?

 

Şahsen, bu gibi durumlarda nesnelerin başlatma işlevini kullanıyorum.

Önce bir dizi oluşturulur ve ardından tüm parametrelerin ayarlanabildiği dizideki tüm nesneler için Init() işlevi çağrılır.

Ayrı bir işlevle başlatma, nesnelerin yeniden başlatılmasına izin verir ve bir kurucuda başlatılırsa, nesne yeniden başlatılamaz.

 
Georgiy Merts # :

Şahsen, bu gibi durumlarda nesnelerin başlatma işlevini kullanıyorum.

Önce bir dizi oluşturulur ve ardından tüm parametrelerin ayarlanabileceği tüm dizi nesneleri için Init() işlevi çağrılır.

Ayrı bir işlevle başlatma, nesnelerin yeniden başlatılmasına izin verir ve bir kurucuda başlatılırsa, nesne yeniden başlatılamaz.

Ben de öyle tahmin etmiştim. Teşekkür ederim !

 

Ve bir an. Bir işaretçi aracılığıyla nesne dizileri oluşturmak daha iyidir. Aksi takdirde, yığın belleğinde çok küçük bir dizi elde edersiniz:

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 # :

Ve bir an. Bir işaretçi aracılığıyla nesne dizileri oluşturmak daha iyidir. Aksi takdirde, yığın belleğinde çok küçük bir dizi elde edersiniz:

Olası bir soruna bir örnek olması güzel olurdu.

 
Ihor Herasko # :

Ve bir an. Bir işaretçi aracılığıyla nesne dizileri oluşturmak daha iyidir. Aksi takdirde, yığın belleğinde çok küçük bir dizi elde edersiniz:

Ah öyle mi?

 
evet saçmalık
 
fxsaber # :

Olası bir soruna bir örnek olması güzel olurdu.

Bu bir sorun değil, çok daha az potansiyel bir sorun. Sadece MT'de bellekle çalışmanın özellikleri. İşte statik dizi:

 #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 ()
{
}

Ve işte dinamik dizi:

 #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];
}

Bu durumda, her şey derlenir ve çalışır.

 
Ihor Herasko # :

Bu bir sorun değil, çok daha az potansiyel bir sorun. Sadece MT'de bellekle çalışmanın özellikleri. İşte statik dizi:

Ve işte dinamik dizi:

Bu durumda, her şey derlenir ve çalışır.

Ve yığının nesi var? İlk durumda, statik olarak (derleme aşamasında) yığında büyük bir bellek bloğu ayırmaya çalıştınız, bu da derleyiciden hak ettiğiniz bir alnını aldınız, çünkü gerçek hayatta olup olmayacağı hiç belli olmayacak. çok fazla bellek ayırmak mümkün olabilir veya olmayabilir.

İkinci durumda, çalışma zamanında zaten büyük bir bellek parçası tahsis etmiş olursunuz. Ve burada, program zaten belirli bir makine kaynağı (bellek) ile çalıştığından, tahsis etmenin mümkün olup olmayacağı hemen açıktır.

Ve işaretçiler ne durumda? stat sırasında önceden tanımlanmış iki türden mql cinsinden diziler. derleme ve dinamik. Yalnızca * işaretçileri dinamik dizilere değil, aynı zamanda sıradan sınıf alanlarına da işaret edebilir. Bu nedenle, burada işaretçilerin kullanılması kesinlikle haklı değildir.

ps işaretçiler, sınıflar, makrolar gibi koddan garip bir izlenim - neler olup bittiğine dair tam bir anlayış eksikliği.

 
Ihor Herasko # :

Bu bir sorun değil, çok daha az potansiyel bir sorun. Sadece MT'de bellekle çalışmanın özellikleri. İşte statik dizi:

Ve işte dinamik dizi:

Bu durumda, her şey derlenir ve çalışır.

Bu doğru örnek değil, sadece hiçbir şey söylemeyen bir derleyici sınırlaması, sadece geliştiriciler öyle karar verdi.

İki seçenek varsa - birinde büyük bir statik dizi, diğerinde küçük bir dizi ve şimdi, program çalışırken, bir durumda, örneğin bir işlevi özyinelemeli olarak çağırırken ve diğerinde sorunlar ortaya çıkar. aynı koşullar altında - hayır. O zaman taze sıkılmış meyve suyunun tehlikeleri hakkında bir sonuç çıkarmak mümkün olacaktır)))

 
Vasiliy Sokolov # :

Ve yığının nesi var? İlk durumda, statik olarak (derleme aşamasında) yığında büyük bir bellek bloğu ayırmaya çalıştınız, bu da derleyiciden hak ettiğiniz bir alnını aldınız, çünkü gerçek hayatta olup olmayacağı hiç belli olmayacak. çok fazla bellek ayırmak mümkün olabilir veya olmayabilir.

İkinci durumda, çalışma zamanında zaten büyük bir bellek parçası tahsis etmiş olursunuz. Ve burada, program zaten belirli bir makine kaynağı (bellek) ile çalıştığından, tahsis etmenin mümkün olup olmayacağı hemen açıktır.

Ve işaretçiler ne durumda? stat sırasında önceden tanımlanmış iki türden mql cinsinden diziler. derleme ve dinamik. Yalnızca * işaretçileri dinamik dizilere değil, aynı zamanda sıradan sınıf alanlarına da işaret edebilir. Bu nedenle, burada işaretçilerin kullanılması kesinlikle haklı değildir.

ps işaretçiler, sınıflar, makrolar gibi koddan garip bir izlenim - neler olup bittiğine dair tam bir anlayış eksikliği.

Yerel düzeyde bir bildirimde bulunarak ve o kadar da korkunç olmayan bir sayı koyarak örneği biraz değiştirirseniz, derleyici sorunun tam olarak ne olduğunu zaten düz metin olarak yazar:

 #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'ta aniden tartışmak istersen, hoşgeldin .
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. Все работало...
Neden: