2012-09-18 49 views
5

Aquí está la declaración. Creo que esto está usando un operador de reparto, pero ¿cuál es el problema con el incremento de publicación? Declaración¿Qué significa esta sintaxis de C++?

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

y definición de C:

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

Declaración de la clase 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]; 
    } 

}; 

La clase padre, datmoConditionalDensity, sólo tiene un destructor virtual.

Habría sido fácil responder a esto depurando el código, pero este código no se compilará en Windows (necesita un montón de bibliotecas externas).

+2

El lema detrás de esa línea de código en particular es: ¿La legibilidad es para los débiles? – Grizzly

+3

@Grizzly, los programadores reales lo hacen todo en una sola línea ...con la pantalla apagada ... en la oscuridad ... mientras usa un bolígrafo. :) – riwalk

Respuesta

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

Vamos a desglosarlo:

(*C) 

Esto elimina referencia al puntero. C es un puntero inteligente y, por lo tanto, se puede desreferenciar para obtener el elemento real al que se apunta. El resultado es un objeto conditional_density.

(*C)(x_i,gi_tn,f) 

Este llama a la () el operador sobrecargado en la clase conditional_density. Puede ser extraño verlo la primera vez, pero es un operador como todo lo demás. La conclusión es que llama a este código:

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]; 
    } 

que devuelve una referencia a un doble. Finalmente:

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

Debido a que el sobrecargado () operador devuelve una referencia a un doble, puedo usar ++ en él que se incrementa el doble.

+3

"Muy raramente usado" ??? – akappa

+0

@akappa, tienes razón, estaba pensando en el operador de coma (no me preguntes por qué). Mi error :) – riwalk

3

Si interpreto esto correctamente, C es un puntero a un objeto de función (algo que tiene un operator() definido). Esto significa que

(*C)(x_i,gi_tn,f) 

Medios "desreferenciar C para recuperar el objeto función, entonces lo invocan con argumentos x_i, gi_tn y f. Tenga en cuenta que la función devuelve un double&, por lo que esta línea

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

significa "desreferencia C, llamar a la función con los argumentos apropiados, y finalmente postincrementar el resultado."

Espero que esto ayude!

0

El operador() (int, int, int) devuelve una referencia a un elemento de la matriz estática de double.

El operador ++ incrementa el valor que se devolvió.