Çözdüm, ancak başka birinin aynı sorunla karşılaşması durumunda çözümü burada bırakıyorum.
İmzasını değiştiren yöntem geçersiz kılma işleminden sonra const anahtar sözcüğünü unuttum.
Çözdüm, ancak başka birinin aynı sorunla karşılaşması durumunda çözümü burada bırakıyorum.
İmzasını değiştiren yöntem geçersiz kılma işleminden sonra const anahtar sözcüğünü unuttum.
bunun için yöntemleri geçersiz kıldığınızda her zaman 'geçersiz kılma' anahtar sözcüğünü kullanmanız gerekir, bu şekilde yöntem imzası değiştirilirse derleyici bağırır:
'const' farkı nedeniyle derlenmeyecek
Ayrıca her iki durumda da 'sanal' anahtar kelimeyi unuttunuz:
Ayrıca her iki durumda da 'sanal' anahtar kelimeyi unuttunuz:
Hayır... Çocuğun olası herhangi bir türetilmiş tarafından geçersiz kılınmasını istemiyorum. Çalışmasını sağlamak için const'ı kaçırdım ve derleyici ile onaylamak için geçersiz kıldım
Evet, ancak en azından CObject'te sanal anahtar kelimeye ihtiyacınız var
nicholishen : Hayır... Çocuğun herhangi bir olası türetilmiş tarafından geçersiz kılınmasını istemiyorum. |
|
|
Tabana sanal eklememek polimorfizmi kaybetmenize neden olur - yöntem çalışma zamanında dinamik olarak değil statik olarak çağrılır.
{
public :
void Sub()
{
Print ( "a.sub" );
}
};
class b : public a
{
public :
void Sub()
{
Print ( "b.sub" );
}
};
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart ()
{
//---
clsa *a;
clsa= new b;
clsa.Sub();
}
Burada yanılıyorsun, whroeder1.
Tabana sanal eklememek polimorfizmi kaybetmenize neden olur - yöntem çalışma zamanında dinamik olarak değil statik olarak çağrılır.
{
public :
void Sub()
{
Print ( "a.sub" );
}
};
class b : public a
{
public :
void Sub()
{
Print ( "b.sub" );
}
};
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart ()
{
//---
a *clsa;
clsa= new b;
clsa.Sub();
}
Doğru. Ayrıca sanal'ın atlanması, türetilmiş sınıfın geçersiz kılabileceği, ancak bir üst işaretçiden çağrılmayacağı anlamına gelir.
- Ücretsiz alım-satım uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz
Listelerin sıralanmasının mql5'te nasıl uygulanacağına dair herhangi bir belge bulamıyorum. CList'in CObject işaretçisinden Compare() öğesini çağırdığını görüyorum. Öyleyse, ana işaretçiden alt sınıf Compare() geçersiz kılınan yöntemini nasıl çağırabilirim?
Misal:
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
class PriceScore : public CObject
{
protected :
int price;
int score;
public :
PriceScore( void ){}
PriceScore( int p, int s):price(p),score(s){}
~PriceScore( void ){}
int Compare( const CObject *node, const int mode= 0 );
void Price( const int p){price = p;}
int Price() const { return price;}
void Score( const int s){score = s;}
int Score() const { return score;}
};
int PriceScore::Compare( const CObject *node, const int mode= 0 ) //Can't call this override from CList
{
PriceScore *pc = (PriceScore*)node;
Print ( __FUNCTION__ , ":Compare called. Incoming: " ,pc.Score(), " This: " , score); //Doesn't log because this isn't called from CObject'
if (pc.Score()< score) return 1 ;
else if (pc.Score()> score) return - 1 ;
else return 0 ;
}
void OnStart ()
{
//---
CList list;
list.Add( new PriceScore( 100 , 500 ));
list.Add( new PriceScore( 1 , 5 ));
list.Add( new PriceScore( 13 , 5000 ));
list.Add( new PriceScore( 987987 , 567 ));
list.Add( new PriceScore( 98798778 , 1 ));
PriceScore *node = NULL ;
Print ( "-------------------" , TimeCurrent (), "--------------------" );
for ( int i= 0 ;i<list.Total();i++)
{
node = list.GetNodeAtIndex(i);
Print ( "Price = " ,node.Price(), ", Score = " ,node.Score());
}
list.Sort( 1 ); //Can't call overriden child method'
Print ( "-------------------SORTED--------------------" );
for ( int i= 0 ;i<list.Total();i++)
{
node = list.GetNodeAtIndex(i);
Print ( "Price = " ,node.Price(), ", Score = " ,node.Score());
}
}