CList sort() çalışması için CObject içindeki Compare() nasıl geçersiz kılınır? - sayfa 3

 
Gustavo Hennemann :

Merhaba @Alain Verleyen ,

GetPrice() yöntemini değiştirdim, CopyClose() kullanarak yerleştirdim CopyBuffer() kullanıyorum. Bu ana hedefi değiştirmez.

Bu nedenle, getPrice() yönteminde "const" anahtar sözcüğünü kullanırsam, şu hatayı alıyorum: " 'CopyBuffer' - aşırı yüklemelerin hiçbiri " işlev çağrısına uygulanamaz . Bunun, CopyBuffer bir const yöntemi olmadığı ve bir const yöntemi içinde const olmayan yöntemi çağırmanın mümkün olmadığı için gerçekleştiğini düşünüyorum.

Güncellenmiş kodunuzu gösterin lütfen.
 

Görünen o ki, "bu"nun değerini almak için Compare() işlevinde "&" operatörünü kullanarak sorunu çözdüm:


 int PriceScore::Compare( const CObject *node, const int mode= 0 ) const
{
   PriceScore *thisObject = (PriceScore*)& this ;
   PriceScore *pc = (PriceScore*)node;

   Print ( __FUNCTION__ , ":Compare called. Incoming: " , pc.Score(), " This: " , score);
   
   if (pc.Score() < thisObject.getPrice())
       return 1 ;
   else if (pc.Score() > thisObject.getPrice())
       return - 1 ;
   else
       return 0 ;
}


Sonunda beklediğim değeri aldım.

 

thisObject'i bırakabilir ve karşılaştırmada "bu" ile değiştirebilirsiniz.

Ama neden "Karşılaştır" işlevi yerine "operatör" işlevini kullanmıyorsunuz? Kodun daha sonra okunmasını kolaylaştırır.

 
Doerk Hilger :

thisObject'i bırakabilir ve karşılaştırmada "bu" ile değiştirebilirsiniz.

Ama neden "Karşılaştır" işlevi yerine "operatör" işlevini kullanmıyorsunuz? Kodun daha sonra okunmasını kolaylaştırır.


CObject temel sınıfının polimorfik bir yöntemi olduğundan ve Collection sınıfları, CArrayObj ve CList'te sıralama ve arama gerçekleştirmek için geçersiz kılınması gerekir.

 
Gustavo Hennemann :

Görünen o ki, "bu"nun değerini almak için Compare() işlevinde "&" operatörünü kullanarak sorunu çözdüm:



Sonunda beklediğim değeri aldım.


Bu mantıkla ne elde etmeyi umduğunuzdan emin değilim. Tipik olarak, sıralama ve arama için yalnızca aynı öğeleri karşılaştırmak istersiniz.

...
if ( this .thingToSort > other.thingToSort) return 1 ;
...
 
nicholishen :

Bu mantıkla ne elde etmeyi umduğunuzdan emin değilim. Tipik olarak, sıralama ve arama için yalnızca aynı öğeleri karşılaştırmak istersiniz.

Aynen şimdi sıralama oluyor, ondan önce kıyaslama yapamadım, hatalar, hatalar ve hatalar alıyordum. Şimdi çalışıyor.

Bu yaklaşım bariz değil ve hiçbir belgede yok, bunu elde edene kadar çok fazla test ve "deneme yanılma" yapmak zorunda kaldım. Umarım diğerleri çözümün tadını çıkarabilir.

 
Gustavo Hennemann :

Aynen şimdi sıralama oluyor, ondan önce kıyaslama yapamadım, hatalar, hatalar ve hatalar alıyordum. Şimdi çalışıyor.

Bu yaklaşım bariz değil ve hiçbir belgede yok, bunu elde edene kadar çok fazla test ve "deneme yanılma" yapmak zorunda kaldım. Umarım diğerleri çözümün tadını çıkarabilir.


"this" değerini almak için Compare( ) işlevinde neden "&" operatörüne ihtiyaç duyduğunuzu merak ediyorum.


 int PriceScore::Compare( const CObject *node, const int mode= 0 ) const
{
   /* PriceScore *thisObject = (PriceScore*)& this ; */
   PriceScore *pc = (PriceScore*)node;

   Print ( __FUNCTION__ , ":Compare called. Incoming: " , pc.Score(), " This: " , score);
   
   if (pc.Score() < /*thisObject.*/getPrice())
       return 1 ;
   else if (pc.Score() > /*thisObject.*/getPrice())
       return - 1 ;
   else
       return 0 ;
}
 
Ex Ovo Omnia :

"this" değerini almak için Compare( ) işlevinde neden "&" operatörüne ihtiyaç duyduğunuzu merak ediyorum.


GetPointer(this) kullanmanın karşılığıdır.
 
nicholishen :
GetPointer(this) kullanmanın karşılığıdır.

Peki, bu "neden" sorusuna cevap vermiyor. İşaretçiyi kendine ifşa etmek için hiçbir sebep yoktu.

 
Ex Ovo Omnia :

Eh, bu "neden" sorusuna cevap vermiyor. İşaretçiyi kendine ifşa etmek için hiçbir sebep yoktu.

Hayır, kesinlikle bu örnekte gereksiz bir çıkarma olduğu için değil, ama diyelim ki bunu yalnızca bir işaretçiyi kabul eden bir yönteme iletiyorsunuz, o zaman onu kullanmanız gerekecek... method(&this)