Hatalar, hatalar, sorular - sayfa 1357

 
Bu arada yukarıdaki koddan bir şey anlamadım, operatör== nerede çağrılacak? Sadece iki uzun karşılaştırma var ve hepsi bu
 
Alexey Navoykov :
Bu arada yukarıdaki koddan bir şey anlamadım, operatör== nerede çağrılacak? Sadece iki uzun karşılaştırma var ve hepsi bu
 class A { public :
         bool operator ==( const A& ) { Print(__FUNCTION__); return true; }
};
class B {};
void OnStart ()
{
         bool res;
        A *a1, *a2;
        B *b1, *b2;
        res = a1 == a2; //сейчас сравниваются указатели
                        //предлагается вызывать operator==()
        res = b1 == b2; //сравниваются указатели (предложение здесь ничего не меняет, поскольку нет B::operator==)
        res = IsEqualPointer( a1, a2 ); //сравниваются указатели
}
IsEqualPointer, bir şablon veya ::GetPointer gibi genel bir işlev olabilir.
 
A100 :

...

IsEqualPointer, bir şablon veya ::GetPointer gibi genel bir işlev olabilir.

Seni anlamaktan tamamen vazgeçtiğim bir şey. Ne yapmaya çalıştığınızı meslekten olmayanların terimleriyle açıklayabilir misiniz? Yukarıdaki kodda hatalar var (== operatörünün ne argümanı ne de dönüş değeri var), tüm bunlardan bir şey anlamak zor.

Hemen belirtmeliyim ki pointer karşılaştırma/atama sorunu hiç ortaya çıkmadı bunun için GetPointer (a) == GetPointer (b) yeterlidir. Bu nedenle, görev yalnızca nesnelerin kendilerinin karşılaştırmasını/atamasını ifade eder. Onlar. bu nesnelerin işaretçiler veya bağlantılarla temsil edilip edilmediğine bakılmaksızın bu işlemleri gerçekleştirmesi garanti edilir.

 
Alexey Navoykov :

Yukarıdaki kodda hatalar var (== operatörünün ne argümanı ne de dönüş değeri var), tüm bunlardan bir şey anlamak zor.

Düzeltildi. Tanımlanmışsa, işaretçiler için de operatör==(...) çağrılması önerilir, o zaman GetPointer (a)==GetPointer(b) a.operator==( b ) çağrılmasına neden olur, bu nedenle IsEqualPointer önerilir eşitlik için işaretçileri karşılaştırmak için
 
A100 :
GetPointer(a)==GetPointer(b), a.operator==( b )'nin çağrılmasına neden olacak
Nasıl oluyor?
 
Alexey Navoykov :

Bu arada, ilk durumda bir nesneye açıkça erişme ve ikinci durumda (hantal GetPointer yerine) nesne işaretçisini alma olasılığı için * ve & operatörlerinin MQL'ye eklenmesine ne dersiniz? Ve yıldız işareti basitçe umutsuzca gereklidir. Dilde yerini alacak bir şey yok. Bu olmadan, A100'ün biraz daha yukarıda belirttiği gibi, nesnelerin kendileri yerine bazı eylemlerin işaretçilerle gerçekleştirildiği gibi durumları kontrol etmek imkansızdır. Şahsen benim için bu sürekli bir sorun, her zaman tetikte olmalıyım veya her yerde A.operator=(B), A.operator!=(B)'yi açıkça belirtmeliyim, yani. özlülük kaybolur ve operatör aşırı yüklemesi aslında anlamını kaybeder.

Bir şekilde bu sorunu zaten gündeme getirdim, ancak konu öldü. Sonunda bu soruyu bitirelim.

Aşağıdaki kullanımı kastediyorsanız, gönderdiğiniz için teşekkür ederiz:
CFoo   f1,f2;
CFoo *pf1=&f1;
CFoo *pf2=&f2;

*pf1!=*pf2
*pf1=*pf2;

Buna katılıyorum, bu konuyu mutlaka gündeme getireceğim ve tartışacağız.
 
Alexey Navoykov :
Nasıl oluyor?
 class A { public :
         bool operator ==( const A& ) { Print ( __FUNCSIG__ ); return true ; }
         bool operator  <( const A& ) { Print ( __FUNCSIG__ ); return true ; }
};
void OnStart ()
{
         bool res;
        A a1, a2;
        res = GetPointer ( a1 ) == GetPointer ( a2 ); //сейчас сравниваются указатели, а будет вызываться operator==, как сейчас происходит для следующей строки
        res = GetPointer ( a1 )  < GetPointer ( a2 ); //вызывается operator<
}
Operatör== operatörünü< ile eşitlerseniz, sonuç eşitlenir
 
A100 :
...
Operatör== operatörünü< ile eşitlerseniz, sonuç eşitlenir

Sevgili, peki, ne teklif ettiğini kontrol etmedin bile! Önceki durumda olduğu gibi, kodda bariz hatalar olduğunda, yani. derlemeye çalışmadın bile. Dizlerinin üstüne bir şeyler karaladılar, kendi düşünceleri, "Ben nazikken çınla, yazık değil" gibi... Mümkün mü? Böyle saçmalıklara girmeyelim.

Ben kendim sürekli olarak işaretçileri ve aşırı yükleme operatörlerini karşılaştırıyorum ve şu anda hayalini kurduğunuz bir şey hiç olmadı. Ve şimdi, kodunuzu kontrol ettikten sonra, hiçbir mucize olmadı, == operatörü olması gerektiği gibi başlamıyor.

 
Alexey Navoykov :

Ve şimdi, kodunuzu kontrol ettikten sonra, hiçbir mucize olmadı, == operatörü olması gerektiği gibi başlamıyor.

Teklifin özü sadece çalıştırmaktır. Mevcut sistemdeki değişikliklerden bahsediyorum.
 
A100 :
Teklifin özü sadece çalıştırmaktır.

Bu neden başka? Her şey baş aşağı.

Tam tersi daha mantıklı: < ve > işaretçilerin karşılaştırılmasına yol açar.