MQL5'te ve şimdi MQL4'te işaretçiler ve referanslar hakkında hala bir şey anlamıyorum. Ekstra kod dışında referans ve işaretçi ile geçiş arasındaki fark nedir? C++'da bir fark var ama burada ne fark var? Eğer zor değilse daha detaylı yazalım.
Referans ile geçmek, referans ile geçilen nesnenin ilklendirilmesini gerektirir. İşaretçi ile geçişte bu kısıtlama yoktur:
TestShapeRef fonksiyonu çağrıldığında, şekil ilklendirilmediği için kod çökecektir. Öte yandan, TestShapePointer fonksiyonu içinde, aktarılan nesnenin ilklendirilip ilklendirilmediğinin sürekli kontrol edilmesi gerekir. Bu nedenle, mantıksız kuralı izleyin:
Nesnenin fonksiyona aktarıldığı anda var olduğu garanti edilmeliyse - bir "&" geçişi kullanın. Eğer fonksiyon durumu tanımlanmamış bir nesne gerektiriyorsa - "*" işaretçisi ile geçişi kullanın ve bu fonksiyonun içinde geçen işaretçinin geçerliliğini kontrol edin.
Aklınızda tutmanız gereken ince bir nüans daha vardır. Önceki örneği düşünün:
Bu program doğru çalışacak mı? Hayır, TestShapePointer fonksiyonunda bir nesne oluşturmayı garantilemiş gibi görünmemize rağmen printf(shape.name); //ERROR (!?) satırında "invalid pointer access" hatası ile sonlanacaktır. Mesele şu ki, aslında shape yerine bir NULL referansı geçildi. Yani, fonksiyonun içindeki şekil ile geçirilen şekil farklı nesnelerdir! Bu nedenle, fonksiyondan çıktıktan sonra, shape hala NULL'a eşittir ve fonksiyon içindeki shape işaretçisi kaybolur (yığında temizlenir). Yani.
//+------------------------------------------------------------------+//||//+------------------------------------------------------------------+class CFoo
{
};
//+------------------------------------------------------------------+//||//+------------------------------------------------------------------+class CBar : public CFoo
{
public:
void func(int x) { Print("Hello from Bar ",x); }
};
//+------------------------------------------------------------------+//||//+------------------------------------------------------------------+void func(CFoo *foo)
{
//--- doğrudan işaretçiden temel türe döküm ile çağrı
((CBar*)foo).func(1);
//--- hedef türe dönüştürme ve işaretçinin bir kopyasını gerekli türle kaydetme ile çağrı
CBar *b=(CBar *)foo;
b.func(2);
//--- dinamik olarak oluşturulan sınıfı sildelete foo;
}
//+------------------------------------------------------------------+//||//+------------------------------------------------------------------+voidOnStart()
{
func(new CBar);
}
//+------------------------------------------------------------------+
MQL5'te ve şimdi MQL4'te işaretçiler ve referanslar hakkında hala bir şey anlamıyorum. Ekstra kod dışında referans ve işaretçi ile geçiş arasındaki fark nedir? C++'da bir fark var ama burada ne fark var? Eğer zor değilse daha detaylı yazalım.
Referans ile geçmek, referans ile geçilen nesnenin ilklendirilmesini gerektirir. İşaretçi ile geçişte bu kısıtlama yoktur:
TestShapeRef fonksiyonu çağrıldığında, şekil ilklendirilmediği için kod çökecektir. Öte yandan, TestShapePointer fonksiyonu içinde, aktarılan nesnenin ilklendirilip ilklendirilmediğinin sürekli kontrol edilmesi gerekir. Bu nedenle, mantıksız kuralı izleyin:
Aklınızda tutmanız gereken ince bir nüans daha vardır. Önceki örneği düşünün:
Bu program doğru çalışacak mı? Hayır, TestShapePointer fonksiyonunda bir nesne oluşturmayı garantilemiş gibi görünmemize rağmen printf(shape.name); //ERROR (!?) satırında "invalid pointer access" hatası ile sonlanacaktır. Mesele şu ki, aslında shape yerine bir NULL referansı geçildi. Yani, fonksiyonun içindeki şekil ile geçirilen şekil farklı nesnelerdir! Bu nedenle, fonksiyondan çıktıktan sonra, shape hala NULL'a eşittir ve fonksiyon içindeki shape işaretçisi kaybolur (yığında temizlenir). Yani.Farklı türlerde nesneler içeren bir dizi oluşturmak mümkün müdür?
Bu örneği ele alalım:
//---
Miras alınan sınıfların yöntemlerine nasıl erişilir?
Mirasçı sınıfların yöntemlerine nasıl erişilir?
Bir hedef türü seçmeyi denediniz mi?
Hayır. İlk defa duyuyorum. Nerede okuyabilirim?
Olağan tip dönüşümü, işte bir örnek:
Hedef türe döküm yapmayı denediniz mi?
Kahretsin, bundan sonra dil güvenliğinden mi bahsediyorsun?
Çok biçimlilik kullanmak daha iyi olmaz mıydı?
Şöyle bir şey: