2012-09-18 537 views
5

以下是聲明。我相信這是使用一個演員操作符,但後增量的處理是什麼?這個C++語法是什麼意思?

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

宣言和定義的C

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

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

}; 

父類,datmoConditionalDensity,只有一個虛擬析構函數。

通過調試代碼很容易回答這個問題,但是這個代碼不會在Windows下生成(需要一堆外部庫)。

+2

特定行代碼背後的座右銘是:可讀性是爲了懦夫? – Grizzly

+3

@Grizzly,真正的程序員在一行中完成所有工作......屏幕關閉......在黑暗中......在使用筆時。 :) – riwalk

回答

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

讓我們來分析一下:

(*C) 

這解引用指針。 C是一個智能指針,因此可以取消引用實際元素。結果是一個conditional_density對象。

(*C)(x_i,gi_tn,f) 

這就要求在conditional_density類的重載()運營商。第一次看到它可能很奇怪,但它和其他所有東西一樣是一個操作符。底線是它叫這個代碼:

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

它返回一個雙引用。最後:

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

因爲重載()操作返回到雙參考,我可以用它++這增加了一倍。

+3

「很少使用」? – akappa

+0

@akappa,你說得對,我正在考慮逗號運算符(不要問我爲什麼)。我的錯 :) – riwalk

3

如果我正確解釋這個,C是一個指向函數對象的指針(有一個定義了operator()的東西)。這意味着,

(*C)(x_i,gi_tn,f) 

辦法「取消引用C找回函數對象,然後用參數x_igi_tnf調用它。請注意,該函數返回一個double&,所以這行

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

的意思是「取消引用C,用適當的參數調用函數,並最終發佈後增加結果。」

希望這有助於!

0

operator()(int,int,int)返回對double靜態數組元素的引用。

++運算符遞增返回的值。