2012-01-20 42 views
2

我正在研究一個小的C++示例,學習C++。有人寫了主要功能已經是這樣的:賦值給C++類方法?

int main() 
{ 
    map2d p1(1.,3.);  
    const map2d p2(0.,0.); 

    p1.x();   // testing the access to member variable 
    p2.x();   // testing the access to member variable 

    p1.x() = 3.;  // changing the member variable 

    return 0; 
} 

好的。我創建了一個名爲map2d的類。到目前爲止工作到成員變量必須更改p1.x() = 3.;。我的問題是,如何做到這一點?我的階級是這樣的:

class map2d 
{ 
    private: 
     double xp, yp; 
    public: 
     map2d (double xnew, double ynew): xp(xnew), yp(ynew) {} 

     double x() const { return xp; } // here is my problem 
}; 

我想用&返回一個引用,但這並沒有解決。我用了類似的東西:

double& x() const { return xp; } 

我做錯了什麼?你有什麼想法如何做到這一點?

+0

嘗試瞭解const的正確性,那麼它將是顯而易見的。 – PlasmaHH

+1

您是否嘗試閱讀任何編譯器的錯誤消息? –

回答

8

您不能從可標記爲const的方法返回可修改的l值引用給不可變類的成員變量。通過將方法標記爲const,您告訴編譯器它不會更改任何未標記爲mutable的數據成員,也不會調用任何可以更改非可變類成員狀態的類方法。

你基本上需要你的存取函數的兩個重載版本:

double x() const { return xp; } //constant version 
double& x() { return xp; }  //non-constant version 

哪個重載函數的版本將選擇取決於調用類方法的情況下。這是基於從中調用方法的類實例是常量還是可變類引用。例如:

void func_a(const map2d& map) 
{ 
    double x = map.x(); //calls const version 
    /* map.x() = 5; <== calls const version but you'll get a compiler error 
         for returning a non-l-value on left-hand-side of 
         assignment operator */ 
} 

void func_b(map2d& map) 
{ 
    map.x() = 5;  //calls non-const version 
    double x = map.x() //still calls non-const version 
} 
+0

那麼您可以從標有'const'的方法(例如,對靜態變量的引用)返回一個l值引用,但是您不能從一個引用中返回一個非'mutable' _member變量_ 'const'方法 –

+0

最後一段容易讓人誤解。它應該說的是,根據成員函數調用的隱式實例參數是常量還是可變引用來選擇超載。 –

+0

好的,我會解決這個問題... – Jason