Yazma hakkında soru - sayfa 4

 
Ilya Malev :

Sorunun ne olduğu çok açık değil. Nesnenin başlatılmasını Init() türünde ayrı bir yönteme, hatta belki sanal bir yönteme taşımak mümkün değil mi?

Tabii ki mümkün. class.get_int()/class.get_double()/class.get_string()/... ?) yapmak mümkün değil mi? Stil, alışkanlık...

 
pavlick_ :

Tabii ki mümkün. class.get_int()/class.get_double()/class.get_string()/... ?) yapmak mümkün değil mi? Stil, alışkanlık...

Mümkün, ancak o zaman nerede double d varsa, var[]; d=var[x] yerine d=var[x].get_double yazın. Mazoşizme gireceksek, topluca =))

 
Ilya Malev :

Yani, sonunda konu, yazma işlemini (örtük dahil) aşırı yükleme olasılığını, yani bir yöntem çağrısının bağlamını belirleme ve beklenen dönüş değerinin türüne bağlı olarak mql'ye sokma arzusuna indirgenir. bu bağlamda istediğiniz kodu çağırın.

bu açıkça bir C++ standardı değildir ve genel olarak, C++ ne işe yarardı (MQL geliştiricileri tarafından temel alınmıştır) - C++'da bir programcının açıkça işleyemediği her şey, bu nedenle işaretçilerle çalışmak gerekiyordu ve kendi typedef'inizi yazın

hepsi bu kadar, işaretçi Afrika'da da bir bellek adresine bir işaretçidir, onu her zaman bir parametre olarak iletebilir ve bir işlevin sonucu olarak alabilirsiniz, işaretçiyi iptal edin - bayt belleğindeki fiziksel değeri alın, işaretçiyi yayınlayın yeni türüne - çok fazla bayt bellek alın)))

MQL'de, işaretçilerin nedenini söylemek zor, ancak oradalar, geliştiriciler veri korumanın bir öncelik olduğunu söyledi, bu nedenle "korumalı alanın" ötesine geçebilecek tüm yenilikler hariç tutuldu.



bir konuda, ne yazık ki şablonlarla ( template ) çalışma konusunda çok az pratiğim var, ancak bunun şu şekilde yapılabileceğinden şüpheleniyorum:

1. Sonuç olarak gerekli türü döndüren birkaç aşırı yüklenmiş işlev yazın ve bu türü parametre olarak alın, yani. Böyle:

 //+------------------------------------------------------------------+
int f( const int x)
  {
   return (( int ) 1 );
  };
//+------------------------------------------------------------------+
double f( const double x)
  {
   return (( double ) 2 );
  }
//+------------------------------------------------------------------+
string f( const string x)
  {
   return (( string ) 3 );
  }
//+------------------------------------------------------------------+
void OnStart ()
  { 
   int     a= 0 ;
   double b= 0 ;
   string c= "0" ;
   a = f(a);
   b = f(b);
   c = f(c);
   Print ( "a = " ,a);
   Print ( "b = " ,b);
   Print ( "c = " ,c);
}

2. şimdi f() işlevinin bir şablona sarılması ve x parametresini gizlemesi gerekiyor - şablonlar bunu yapmanıza izin veriyorsa, çağrı a=f() olacaktır - görsel olarak her şey yazmak gibi güzel olacak

 
Igor Makanu :

bu açıkça bir C++ standardı değil

Yanıldığınıza inanıyorum - uzun süredir "saf" C ++ ile yazmamış olmama rağmen, ağ bunun gibi kod örnekleriyle dolu

 class A
{
public :
     operator int () const ;
};

A:: operator int () const
{
     return 0 ;
}
 
Ilya Malev :

Yanıldığınıza inanıyorum - uzun süredir "saf" C ++ ile yazmamış olmama rağmen, ağ bunun gibi kod örnekleriyle dolu

böyle bir örnek düzgün çalışacaktır, ama ya karmaşık tip ? - yapı mı dizi mi? C ++'da bu, türlerine işaretçiler kullanılarak çözüldü, derleyici fiziksel olarak bellek adresini döndürdü ve işaretçinin referansının kaldırılması verilerle doğru çalışmayı sağladı

 
Igor Makanu :

böyle bir örnek düzgün çalışacaktır, ama ya karmaşık tip ? - yapı mı dizi mi? C ++'da bu, türlerine işaretçiler kullanılarak çözüldü, derleyici fiziksel olarak bellek adresini döndürdü ve işaretçinin referansının kaldırılması verilerle doğru çalışmayı sağladı

Mql'de bu örnek ne yazık ki doğru çalışmayacaktır.

Karmaşık bir tür, yapı veya dizinin kendisi, ihtiyaç duyduğu her şeyi aşırı yükleyebilir, aşırı yükleme gerektirmez...

 
Ilya Malev :

Mql'de bu örnek ne yazık ki doğru çalışmayacaktır.

evet, şimdi gördüm, tip dönüştürmeyi aşırı yüklemek istiyorsunuz, MQL yardımı açıkça aşırı yüklenmesine izin verildiğini ve tekli işlemlerin sırasıyla yalnızca tekli ve ikili olarak aşırı yüklendiğini söylüyor, matrislerle çalıştım, aşırı yüklemeye çalıştım ^ - işe yaramadı, mecbur kaldım! kullanmak:

  • ikili +,-,/,*,%,<<,>>,==,!=,<,>,<=,>=,=,+=,-=,/=,*=,%=, &=,|=,^=,<<=,>>=,&&,||,&,|,^;
  • tekli +,-,++,--,!,~;
  • atama operatörü =;
  • indeksleme operatörü [].


Örneğime tekrar baktım - derleyici örneğimi bir şablona sarmama izin vermiyor , ancak yalnızca bir sayı değil, örneğin return((1/x) - ve x parametresi olarak bir dize verebilirim string , genellikle tüm C derleyicileri derleme aşamasındadır, türlerin uygunluğunu kontrol ederler ve MQL belirsiz çözümlerin şablonlara sarılmasına izin vermez

IMHO, göreviniz 1 konu gönderisi, MQL'de yalnızca aşırı yüklenmiş tüm işlevleri tanımlayarak doğru bir şekilde çözülebilir, daha sonra derleme aşamasında iletilen ve döndürülen tüm değişken türleri ve tüm aşırı yüklenmiş işlevler kontrol edilecektir.

 
Igor Makanu :

evet, şimdi gördüm, tip dönüştürmeyi aşırı yüklemek istiyorsunuz, MQL yardımı açıkça aşırı yüklenmesine izin verildiğini ve tekli işlemlerin sırasıyla yalnızca tekli ve ikili olarak aşırı yüklendiğini söylüyor, matrislerle çalıştım, aşırı yüklemeye çalıştım ^ - işe yaramadı, mecbur kaldım! kullanmak

%99 için ^ aşırı yüklemeye izin vermediği bir durum olmadığını söyleyebilirim ama ! verir. Ve aşırı yükleme olasılığı, operatörün tipine bağlı değildir. Bir şeyi yanlış anladın. Bu örneği buraya gönderin, zaten unuttuysanız ve puan aldıysanız, elbette yapmazsınız)

Operatörlerin türünde karşılaştığım tek kısıtlama, mantıksal operatörlerin ==, !=, ! ve = işaretçilere uygulandığında (any_type * ). Doğru aşırı yüklenmeleri için otomatik nesnelerle veya yapılarla çalışmanız gerekir. Son aylarda bu cipslerde bir sürü köpek yedim, bu yüzden güvenle konuşabiliyorum :)

 
Ilya Malev :

%99 için ^ aşırı yüklemeye izin vermediği bir durum olmadığını söyleyebilirim ama ! verir. Ve aşırı yükleme olasılığı, operatörün tipine bağlı değildir. Bir şeyi yanlış anladın. Bu örneği buraya gönderin, zaten unuttuysanız ve puan aldıysanız, elbette yapmazsınız)

Operatörlerin türünde karşılaştığım tek kısıtlama, mantıksal operatörlerin ==, !=, ! ve = işaretçilere uygulandığında (any_type * ). Doğru aşırı yüklenmeleri için ya otomatik nesnelerle ya da yapılarla çalışmak gerekir. Son aylarda bu cipslerde bir sürü köpek yedim, bu yüzden güvenle konuşabiliyorum :)

 #include <Math\Alglib\linalg.mqh>
class Matrix
  {
public :
   CMatrixDouble     M;
   int                row; //m_strok;
   int                col; //n_stolb;
   void               Matrix( void )         {                             }
   void               Matrix( int m, int n)  { M.Resize(m,n); row=m;col=n; }
   //----      умножение матриц
   Matrix operator *( const Matrix &B){Matrix res( this .row,B.col);CAblas::RMatrixGemm( this .row,B.col, this .col, 1.0 , this .M, 0 , 0 , 0 ,B.M, 0 , 0 , 0 , 0 ,res.M, 0 , 0 ); return (res);  }
   //----      транспонирование матрицы
   Matrix operator !( void ){Matrix res( this .col, this .row);CAblas::RMatrixTranspose( this .row, this .col, this .M, 0 , 0 ,res.M, 0 , 0 ); return (res);                             }
   //----      нулевая матрица
   void               zeros( int r, int c) { this .M.Resize(r,c); this .row=r; this .col=c; for ( int i= 0 ;i<r;i++){ for ( int j= 0 ;j<c;j++){ this .M[i].Set(j, 0.0 );}}               }
   //----      вывод в журнал матрицы
   void MatrixPrint( string   separator= "|" , uint digits= 3 ){ string s,sep= " " +separator+ " " ; for ( int i= 0 ;i<row;i++){s=separator; for ( int j= 0 ;j<col;j++) s+= DoubleToString (M[i][j],digits)+sep; Print (s); Sleep ( 123 );}}
private :
   void               Matrix( const Matrix &R) { this =R;                                                                                                            }
  };

matrislerle "klasik" çalışmada, matrisleri dönüştürmek için ^ operatörünü kullanmanız gerekir, işte benim örneğim - SSA yöntemini Matlab'dan taşıdım, bu, matrislerin CMatrixDouble'a dayalı en basit çarpımı, ataması ve aktarımıdır - he .. bu, sakladığı matrislerin boyutlarını bilmiyor (kaç satır ve sütunu var), onu sınıfımda sarmak zorunda kaldım

 
P.S., a, yani Bir ikili operatörü tekli olarak (2-ary, 1-ary olarak) aşırı yüklemek istediniz, o zaman evet, elbette olmaz. Tek istisna []