Hatalar, hatalar, sorular - sayfa 1184

 
A100 :

İşaretçilerle hangi işlemler anlamsız değildir?

Referansların yaygın olarak kullanıldığı herhangi biri.
 
Örneğin, operatör+(...) olarak adlandırılan referanslar arasında toplama operatörü uygulanabilir. İşaretçilerin eklenmesi anlamsızdır, çünkü pratik uygulaması olmayan bir sayı elde edeceğiz.
 
A100 :
Hiçbir anlam ifade etmeyen operatörlerin nesnelere aşırı yüklenmelerini veya basitçe uygulamamalarını engelleyen nedir?
 

Şimdi bu yapıldı (nesneler için aşırı yüklendi) ve her şey yolunda görünüyor. Ama anlamlı olanlar (== ve !=) ile geri kalanı arasında bir çelişki var.

 class A {
public :
         bool operator ==( A* a ) { Print ( __FUNCTION__ ); return ( true   );  }
         bool operator !=( A* a ) { Print ( __FUNCTION__ ); return ( true   );  }
//остальные
         bool operator >>( A* a ) { Print ( __FUNCTION__ ); return ( true   );  }
         bool operator +( A* a )  { Print ( __FUNCTION__ ); return ( false   ); }
         bool operator !()        { Print ( __FUNCTION__ ); return ( true    ); }
//... и т.д.
};

kadarıyla

 void OnStart ()
{
        A *a = new A;
         if ( a == a ) Print ( "1" ); //сравнение указателей как чисел
         if ( a >> a ) Print ( "3" ); //вызывается operator<<( A *)
}

İşaretçileri yalnızca özel bir işlevle karşılaştırarak ortadan kaldırılması önerilen

 void OnStart ()
{
        A *a = new A;
         if ( isEqualPoiner( a, a ) ) Print ( "1" ); //сравнение указателей как чисел
         if ( a == a )               Print ( "2" ); //вызывается operator==( A *)
         if ( a >> a )               Print ( "3" ); //вызывается operator<<( A *)
}
 

İşaretçileri karşılaştırmak için özel bir işlev şöyle yazılabilir.

 template < typename T1, typename T2>
bool isEqualPointer( T1 *t1, T2 *t2 ) { return ( ulong (t1) == ulong (t2) ); }
 
A100 :

Size anlamsız bir sorum var. Çalışmanı paylaşır mısın?

Şablonları ve makroları aktif olarak ve sürekli kullanan birkaç kişiden birisiniz. Ve muhtemelen büyük miktarda birikmiş kodunuz var.

Başkasını bilmem ama kodunuzu ve çalışmanızı görmek benim için çok ilginç olurdu, eğer varsa, halka yayınlamaktan çekinmeyeceksiniz.

Bilmiyorum... kalıpların uygulanması, göstergelerle çalışmak için özel sarmalayıcılar, çizelgeler, her neyse...

 

Şablonları nasıl kullanırım? - Kaydı kısaltmak için. Örneğin, MQL'devirgül işlemi yoktur. Diyelim ki bir rekor var

 int f2( string str )
{
         Print ( str );
         return ( 0 );
}

bool f( int a )
{
         if ( a == 5 )
                 return ( true )
        f2( "abc" );
         return ( false );
}
sonra bir desene sahip olmak
template <typename T 1, typename T 2>
T2 opComma( T1 expression, T2 assignment_expression ) { return ( assignment_expression ); }

4 satır yerine elde ederiz - bir

 bool f( int a )
{
         return ( a == 5 ? true : opComma( f2( "abc" ), false ) );
}
 

Makroları nasıl kullanırım? - tekrar - rekoru kısaltmak için. Örneğin, MQL'de sınıf şablonu yoktur. Önemli değil - bir makro kullanın

 #define Macro( type ) \
class A {       \
public :         \
/*...еще много строк...*/ \
        type a; \
};

//осталось написать
Macro(   uint )
Macro( ulong )
 
Yine, gösterimi kısaltmak için - bir kez tanımlamış olmak
 #define MDT( dt_struct, dt )     \
         MqlDateTime dt_struct;   \
         ZeroMemory ( dt_struct ); \
        TimeToStruct ( dt, dt_struct );

daha sonra beyan etmek yeterli olacaktır.

 datetime dt;
MDT( dt_struct, dt )
 

Örneğin, birkaç tür aynı anda katılabileceğinden, şablonlar aracılığıyla bit düzeyinde kopyalama uyguluyorum

 template < typename T1, typename T2>
T2 BitwiseCopying( T1 type1, T2 )
{
struct Union1 {
        T1      type1;
};
struct Union2 {
        T2      type2;
};
        Union1 union;
        union.type1 = type1;
         return ( ((Union2)union).type2 );
}
 void f()
{
         ulong ul = 0x16 ;
         double d = BitwiseCopying( ul, double ( 0 )); //побитовое копирование из ulong в double
        float f = 36.6 ;
         uint ui = BitwiseCopying( f,     uint ( 0 ));  //побитовое копирование из float в uint

}