我想我仍然需要學習很多不僅關於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()
在其計算。
這是我應該避免或不能做的事情的清單:
+製作的本地副本Person
內recommendDumbbellWeight
(這樣就可以避免類似GymInstructor::recommendDumbbellWeight(Person person)
),因爲我並不需要它減慢我的計劃
+給recommendDumbbellWeight
指針GymInstructor::recommendDumbbellWeight(Person *pPerson)
,因爲我只是隻讀訪問,因此應該避免任何錯誤,通過給予寫入訪問recommendDumbbellWeight
+ Make Person :: bodyMassIndex一個const
函數,因爲它取決於狀態的對象,在這裏例如weight
和height
。
+將函數bodyMassIndex()
移動到某個其他類,因爲它使用了Person
的數據,所以沒有真正的理由爲什麼另一個對象應該執行該計算。如果是這樣,我將不得不將所有數據傳遞給其他班級。
+說,GymInstructor::recommendDumbbellWeight
需要像Person::bodyMassIndex()
小計算更多的結果,那麼我也應該避免只是通過計算的結果與GymInstructor::recommendDumbbellWeight(float bodyMassIndex, float experience, float fitness, ...
類似的東西,因爲它炸燬了我的參數列表,看起來很醜,併產生不必要的代碼。
那實際上剩下的是什麼?我很想在GymInstructor::recommendDumbbellWeight(const Person &person)
中撥打Person::bodyMassIndex()
,但我不能,因爲person
是一個常量引用。
我假設我太愚蠢,看不到非常明顯的解決方案,或者我的設計中存在根本性錯誤。我將如何解決我的問題?
「+ Make Person :: bodyMassIndex是一個const函數,因爲它取決於對象的狀態,在這裏例如重量和高度。」 **這對於非常量是不合理的。** string :: c_str()是const並且完全依賴於狀態。 –