2016-09-14 80 views
1

我想我仍然需要學習很多不僅關於C++,而且面向對象編程本身。在最近的C++項目中,我偶然遇到了一個問題:如果我有一種情況需要將某個const引用傳遞給某個對象,那麼如何使用該對象的非const函數呢?如果我想調用const引用的非const函數,請更正OOP設計?

讓我舉個例子:假設我有一些數據,並以較小運算與數據的函數的類,例如

class Person 
{ 
    private: 
    float weight; 
    float height; 
    float age; 
    ... 

    public: 
    float bodyMassIndex(); 
}; 

現在我有不同的專業知識,如其他類

class GymInstructor 
{ 
    private: 
    float knowledge; 
    int age; 
    ... 

    public: 
    int recommendDumbbellWeight(const Person &person); 
}; 

現在說的功能GymInstructor::recommendDumbbellWeight要使用該功能Person::bodyMassIndex()在其計算。

這是我應該避免或不能做的事情的清單:
+製作的本地副本PersonrecommendDumbbellWeight(這樣就可以避免類似GymInstructor::recommendDumbbellWeight(Person person)),因爲我並不需要它減慢我的計劃
+給recommendDumbbellWeight指針GymInstructor::recommendDumbbellWeight(Person *pPerson),因爲我只是隻讀訪問,因此應該避免任何錯誤,通過給予寫入訪問recommendDumbbellWeight
+ Make Person :: bodyMassIndex一個const函數,因爲它取決於狀態的對象,在這裏例如weightheight
+將函數bodyMassIndex()移動到某個其他類,因爲它使用了Person的數據,所以沒有真正的理由爲什麼另一個對象應該執行該計算。如果是這樣,我將不得不將所有數據傳遞給其他班級。
+說,GymInstructor::recommendDumbbellWeight需要像Person::bodyMassIndex()小計算更多的結果,那麼我也應該避免只是通過計算的結果與GymInstructor::recommendDumbbellWeight(float bodyMassIndex, float experience, float fitness, ...類似的東西,因爲它炸燬了我的參數列表,看起來很醜,併產生不必要的代碼。

那實際上剩下的是什麼?我很想在GymInstructor::recommendDumbbellWeight(const Person &person)中撥打Person::bodyMassIndex(),但我不能,因爲person是一個常量引用。
我假設我太愚蠢,看不到非常明顯的解決方案,或者我的設計中存在根本性錯誤。我將如何解決我的問題?

+2

「+ Make Person :: bodyMassIndex是一個const函數,因爲它取決於對象的狀態,在這裏例如重量和高度。」 **這對於非常量是不合理的。** string :: c_str()是const並且完全依賴於狀態。 –

回答

3

聲明的方法const有點像做一個承諾,它不會嘗試修改對象。它不會拒絕你訪問對象的狀態,你仍然可以完美地將它稱爲非const對象。 所以是的,解決方案是float bodyMassIndex() const;

+0

啊,通過聲明函數爲'const',我總是隻想到像'const float bodyMassIndex();'這樣的東西。對於這種困惑感到抱歉。 – hexcoffee

+0

那麼如果你想進一步推測,可以說非靜態方法具有「不可見」參數,並且該方法的cv限定符適用於該參數 – Ap31

0

申報方法爲const,因爲它是一個getter反正 float bodyMassIndex() const;

0

Person::bodyMassIndex()不應該是const的要求是不合理和相當可笑的。 Person::bodyMassIndex()不應該是const的唯一參數是它實際上更改Person對象的狀態。它沒有。

因此,首先有Person::bodyMassIndex() non-const是一個錯誤。班級設計中的錯誤。