Hatalar, hatalar, sorular - sayfa 1201

 

Sanal işlevlerde hata

 class A { public :
         virtual void f() { Print ( __FUNCTION__ ); }
};
class B : public A { public :
         virtual void f() { Print ( __FUNCTION__ ); }
};

class H { public :
        H( A* a ) { H::s[ 0 ] = a; }
         static void g();
         static A* s[ 1 ];
};
A *H::s[ 1 ] = { 0 };
void H::g() { H::s[ 0 ].f(); } //еще обратил внимание, что в этом месте редактор выделяет (.f) зеленым
void OnStart ()
{
        A* b = new B();
        H h( b );
        H::g(); //печатает A::f()
        delete ( b );
}

Sonuç: A::f(), ancak B::f() olmalıdır

 
Pazardaki spam göndericilerle ne yapmalı? Bir şikayet yazdı, spam gönderici bir günlüğüne yasaklandı, şimdi zaten yasağı kaldırıldı ve bokları askıda kalıyor. Yoksa tamam mı? Ürün tartışma sayfası müşteri geri bildirimi için değil mi?
 
Motoellesse :

META TRADER 4'ü OS MAVERICKS'e yüklemeye yardımcı olun, TÜM PROGRAMLARI İNDİRİN, MAC'DE OYNAYIN ^ TAMAMEN YENİ VE HATA VERİYOR.

/*moderatör: hatanın metnini dosya olarak ekleyin*/

 
Motoellesse :

2 - hata ayıklamadan önce.

3- sonra.

Belki farklılıklar vardır, hiçbir şey anlamıyorum)

Çok teşekkürler)

Dosyalar:
 

Derleme Hatası

 class A {
public :
         void f() const { a = 1 ; } //member of the constant object cannot be modified
         static int a;
};
int A::a = 0 ;

const statik izlemek zorunda değilken

Ek olarak, bu hayali bir korumadır, çünkü statik, olağan h() ve A:: f() const işlevi tarafından değiştirildiğinden, const bunu bilmiyor bile

 class A {
public :
         void f() const { h(); } //все равно поменяли значение (а)
         static int a;
};
int A::a = 0 ;

void h()
{
        A::a = 1 ;
}
 
A100 :

Sanal işlevlerde hata

Sonuç: A::f(), ancak B::f() olmalıdır

Gönderdiğiniz için teşekkürler, düzeltildi.
 
A100 :

Derleme Hatası

const statik izlemek zorunda değilken

Ek olarak, bu hayali bir korumadır, çünkü statik, olağan işlev h () ve A:: f () const tarafından değiştirildiğinden, const bunu bilmiyor bile

Gönderdiğiniz için teşekkürler, düzeltildi.
 

h(A* a) çağrısının tüm durumlarında hata 358'i derleyin

 class A {
};

class B {
public :
	B() : a1( NULL ), a2( NULL ), a3( NULL ), a4( NULL ) {}
         void f() const {
                h( a1 ); // не обоснована (1)
                h( a2 ); // не обоснована (2)
                h( a3 ); //    обоснована (3)
                h( a4 ); //    обоснована (4)
        }
              A *       a1;
              A * const a2;
         const A *       a3;
         const A * const a4;
};

void h( A* a )
{
}

h( const A* a) olmadığı için yalnızca (3) ve (4)'te gerekçelendirilir

Benzer bir durum zaten düzeltildi https://www.mql5.com/ru/forum/1111/page1218#comment_1058402 , ancak hatanın oluşumu const'ın varlığından etkilendiğinden muhtemelen farklı bir neden vardır. void f() const bildirimi ve üye işlevleri yok

 

Yapı 976'da derlenmez (hata 358, ancak yapı 975'te hata olmaması nedeniyle daha önce açıklananlardan farklıdır)

 class A {};
struct S { int s; };

void h1( A* a ) {}
void h2(       S& s ) {}
void h3( const S& s ) {}

class B {
public :
         void     f1() const { h1( this .a ); } //не обоснованная и возникла только в build 976
//      void    f2() const { h2( this.s ); } //   обоснованная ошибка в build 976
         void     f3() const { h3( this .s ); } //нормально
        A* a;
        S  s;
};
Belki de yapı 976'da bir const sınıf yönteminden çağrılan normal bir işlevin, const& referansı olmayan bir tarafından kendisine iletilen sınıf üyelerini değiştirebileceği gerçeğiyle ilgili bir hatanın düzeltilmesi nedeniyle. Ancak burada sınıf üyesi bir işaretçidir ve değerinin h( A* a çağrıldığında değiştirilmemesi garanti edilir), ancak yalnızca h( A* &a ) bildirildiğinde değiştirilebilir.
 
A100 :

Yapı 976'da derlenmez (hata 358, ancak yapı 975'te hata olmaması nedeniyle daha önce açıklananlardan farklıdır)

Belki de yapı 976'da bir const sınıf yönteminden çağrılan normal bir işlevin, const& referansı olmayan bir tarafından kendisine iletilen sınıf üyelerini değiştirebileceği gerçeğiyle ilgili bir hatanın düzeltilmesi nedeniyle. Ancak burada sınıf üyesi bir işaretçidir ve değerinin h( A* a ) çağrılırken değiştirilmemesi garanti edilir, ancak yalnızca h( A* &a ) bildirilirken değiştirilebilir.
Gönderdiğiniz için teşekkürler, düzeltildi.