2012-09-18 24 views
5

Oto oświadczenie. Sądzę, że używa on operatora obsady, ale jaki jest stosunek do wzrostu liczby postów?Co oznacza ta składnia C++?

(*C)(x_i,gi_tn,f)++; 

Deklaracja i definicja C:

std::auto_ptr<conditional_density> C(new conditional_density()); 

Deklaracja klasy conditional_density:

class conditional_density: public datmoConditionalDensity{ 
public: 
    static const double l_min, l_max, delta; 
    static double x_scale[X_COUNT]; // input log luminance scale 
    double *g_scale; // contrast scale 
    double *f_scale; // frequency scale  
    const double g_max;  
    double total;  
    int x_count, g_count, f_count; // Number of elements  
    double *C;   // Conditional probability function  
    conditional_density(const float pix_per_deg = 30.f) : 
    g_max(0.7f){ 
    //Irrelevant to the question    
    }  

    double& operator()(int x, int g, int f) 
    { 
    assert((x + g*x_count + f*x_count*g_count >= 0) && (x + g*x_count + f*x_count*g_count < x_count*g_count*f_count)); 
    return C[x + g*x_count + f*x_count*g_count]; 
    } 

}; 

Klasa dominująca datmoConditionalDensity, ma jedynie wirtualny destruktor.

Byłoby łatwo odpowiedzieć na to przez debugowanie kodu, ale ten kod nie będzie budowany pod Windows (potrzebuje garstki zewnętrznych bibliotek).

+2

Motto tej konkretnej linii kodu: Czytelność jest dla mięczaków? – Grizzly

+3

@Grizzly, prawdziwi programiści robią to wszystko w jednym wierszu ...z wyłączonym ekranem ... w ciemności ... podczas korzystania z pióra. :) – riwalk

Odpowiedz

11
(*C)(x_i,gi_tn,f)++; 

Złammy go:

(*C) 

Ten dereferences wskaźnik. C jest inteligentnym wskaźnikiem, a zatem można go dereferencji, aby uzyskać faktyczny element wskazany. Wynikiem jest obiekt conditional_density.

(*C)(x_i,gi_tn,f) 

To wywołuje przeciążone () operatora w klasie conditional_density. To może być dziwne widzieć go za pierwszym razem, ale jest operatorem, tak jak wszystko inne. Podsumowując, kod ten nazywa się:

double& operator()(int x, int g, int f) 
    { 
    assert((x + g*x_count + f*x_count*g_count >= 0) && (x + g*x_count + f*x_count*g_count < x_count*g_count*f_count)); 
    return C[x + g*x_count + f*x_count*g_count]; 
    } 

, który zwraca odniesienie do podwójnego. Wreszcie:

(*C)(x_i,gi_tn,f)++ 

Ponieważ przeciążony operator () zwraca odwołanie do podwójnej, mogę używać ++ na nim, który zwiększa dwukrotnie.

+3

"Bardzo rzadko używany" ?? – akappa

+0

@akappa, masz rację, myślałem o operatorze przecinka (nie pytaj mnie dlaczego). Mój błąd :) – riwalk

3

Jeśli interpretuję to poprawnie, C jest wskaźnikiem do obiektu funkcji (coś, co zdefiniowano jako operator()). Oznacza to, że

(*C)(x_i,gi_tn,f) 

oznacza „dereference C wrócić obiekt funkcyjny, a następnie wywołać ją z argumentami x_i, gi_tn i f. Zauważ, że funkcja zwraca double&, więc ta linia

(*C)(x_i,gi_tn,f)++; 

oznacza "dereferencję C, wywołaj funkcję z odpowiednimi argumentami, a na koniec postinkrementuj wynik."

Mam nadzieję, że to pomoże!

0

Operator() (int, int, int) zwraca odniesienie do elementu tablicy statycznej double.

Operator ++ zwiększa wartość, która została zwrócona.