2012-09-18 46 views
5

Đây là tuyên bố. Tôi tin rằng điều này là sử dụng một nhà điều hành diễn viên, nhưng những gì là đối phó với tăng bài?Cú pháp C++ này có nghĩa là gì?

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

Tuyên bố và định nghĩa của C:

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

Tuyên bố của lớp 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]; 
    } 

}; 

Các lớp cha mẹ, datmoConditionalDensity, chỉ có một destructor ảo.

Sẽ dễ dàng trả lời điều này bằng cách gỡ lỗi mã, nhưng mã này sẽ không được xây dựng trong Windows (cần một loạt thư viện bên ngoài).

+2

Phương châm đằng sau dòng mã cụ thể đó là: Khả năng đọc là dành cho wimps? – Grizzly

+3

@Grizzly, các lập trình viên thực sự làm tất cả trong một dòng ...với màn hình tắt ... trong bóng tối ... trong khi dùng bút. :) – riwalk

Trả lời

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

Hãy phá vỡ nó xuống:

(*C) 

này dereferences con trỏ. C là một con trỏ thông minh, và do đó có thể được dereferenced để có được các yếu tố thực tế đang được trỏ đến. Kết quả là đối tượng conditional_density.

(*C)(x_i,gi_tn,f) 

Điều này gọi nhà điều hành quá tải conditional_density. Nó có thể là lạ để xem nó lần đầu tiên, nhưng nó là một nhà điều hành giống như tất cả mọi thứ khác. Điểm mấu chốt là nó gọi mã này:

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

trả về tham chiếu gấp đôi. Cuối cùng:

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

Bởi vì quá tải () điều hành trả về một tham chiếu đến một đôi, tôi có thể sử dụng ++ trên đó có nghĩa là tăng gấp đôi.

+3

"Rất hiếm khi được sử dụng" ??? – akappa

+0

@akappa, bạn nói đúng, tôi đang nghĩ về toán tử dấu phẩy (đừng hỏi tôi tại sao). Lỗi của tôi :) – riwalk

3

Nếu tôi diễn giải chính xác điều này, C là một con trỏ trỏ đến đối tượng hàm (cái gì đó đã xác định operator()). Điều này có nghĩa rằng

(*C)(x_i,gi_tn,f) 

Phương tiện "dereference C để lấy lại các đối tượng chức năng, sau đó gọi nó với đối số x_i, gi_tn, và f. Chú ý rằng hàm trả về một double&, vì vậy dòng này

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

có nghĩa là "dereference C, gọi hàm với các đối số thích hợp và cuối cùng postincrement kết quả."

Hy vọng điều này sẽ giúp!

0

Toán tử() (int, int, int) trả về tham chiếu đến phần tử của mảng tĩnh gấp đôi.

Toán tử ++ tăng giá trị đã trả về.

Các vấn đề liên quan