2012-02-28 9 views
6

ile bulabilirsiniz. Bu özel karşılaştırıcı, karşılaştırılan iki Nesnenin bazı üye değişkenlerini karşılaştırarak çalışır. BUT işlevini x işlevini bir nesnenin kendisinden ziyade üye değişken türünde kullanıyorum ve işe yarıyor!Bu neden çalışıyor?</p> <p>Özel bir karşılaştırıcı ile Objelerin bir <code>std::set</code> tanımlayabiliriz: std :: set aşağıdaki eserlerini (! Ben bunun işe yaradığını memnunum rağmen) neden anlamıyorum arama anahtarı ve özel karşılaştırıcı

my_class.h

class my_class //just hold an integer 
{ 
    public: 
     int an_int; 

    my_class(int new_int) : an_int(new_int) 
    { } 


    //compare instances of this class by comparing their integers... 
    struct compare_instances 
    {  
     bool operator() (const my_class &a, const my_class &b) const 
     { 
     return a.an_int < b.an_int; 
     } 
    }; 
}; 

main.cpp: Burada

son derece basitleştirilmiş bir örnektir

... 
std::set<my_class, my_class::compare_instances> my_class_set; 
my_class_set.insert(my_class(18)); 
my_class_set.insert(my_class(7) ); 
my_class_set.insert(my_class(22)); 

std::set<my_class, my_class::compare_instances>::const_iterator found_it 
        = my_class_set.find(18); 
std::fprintf(stderr, "found_it->an_int = %d\n", found_it->an_int); 

Çıktı: "found_it-> an_int = 18" !!!! !!

Yukarıdaki kodun derlenmemesini beklerdim ve derleyicinin bana "18 türünde my_class" olduğunu söyler. Ama bu ...

.find'un argümanları, set'un kendisiyle aynı türde değil midir? Belgelerin söyleyeceği şey budur ...

+0

yapıcınıza bakın: 'my_class (int new_int)'. 'int' ile başlayan bir 'my_class 'oluşturabilirsiniz. denemek ve bulmak ("blah") 've bu derleme olmaz :) – vulkanino

cevap

12

Bu, int dolaylı olarak sınıfa dönüştürülebildiği için işe yarar. explicit işaretli olmayan herhangi bir kurucu ve sınıfın kendi türünde olmayan tam bir bağımsız değişkenle çağrılabilir, örtülü bir dönüşüm tanımlar. Bu, etkili bir şekilde, sınıf tipi bir nesne beklendiğinde, int'u da kullanabileceğiniz ve otomatik olarak dönüştürüleceği anlamına gelir.

+0

Tamam, tüm puanlarıma cevabını ekledin. Diğer yorumlarımı siliyorum. 8v) –

+0

@FredLarson ilgisiz olsa bile, ** her zaman ** açıklayıcılar beyan etmenizi önerir misiniz? – vulkanino

+0

@vulkanino: Gizli bir dönüşüm istemiyorsanız, bu kötü bir fikir olmayabilir. Ben örtük dönüştürme için kullanılamaz olsa bile bir kurucuya 'explicit 'ekleme ile ilgili herhangi bir sorun farkında değilim. –

İlgili konular