3 回答

TA貢獻1853條經驗 獲得超18個贊
我從其中一本Effective C ++書籍中回憶一下,這樣做的方法是通過從另一個函數中拋棄const來實現非const版本。
它不是特別漂亮,但它是安全的。由于調用它的成員函數是非const的,因此對象本身是非const的,并且允許拋棄const。
class Foo
{
public:
const int& get() const
{
//non-trivial work
return foo;
}
int& get()
{
return const_cast<int&>(const_cast<const Foo*>(this)->get());
}
};

TA貢獻1828條經驗 獲得超3個贊
怎么樣:
template<typename IN, typename OUT>
OUT BigChunk(IN self, int index) {
// big, non-trivial chunk of code...
return something;
}
struct FooBar {
Something &getSomething(int index) {
return BigChunk<FooBar*, Something&>(this,index);
}
const Something &getSomething(int index) const {
return BigChunk<const FooBar*, const Something&>(this,index);
}
};
顯然你仍然會有目標代碼重復,但沒有源代碼重復。與const_cast方法不同,編譯器將檢查兩種版本方法的const正確性。
您可能需要將BigChunk的兩個有趣實例聲明為類的朋友。這是一個很好用的朋友,因為朋友的功能隱藏在靠近朋友的地方,所以不存在無約束耦合的風險(哦?。?。但我現在不會嘗試這樣做的語法。隨意添加。
有可能BigChunk需要尊重自己,在這種情況下,上面的定義順序不會很好地工作,并且需要一些前向聲明來解決它。
此外,為了避免在標題中找到BigChunk并決定實例化并調用它,即使它在道德上是私有的,你可以將整個批次移動到FooBar的cpp文件中。在匿名命名空間中。內部聯系。還有一個標語“小心豹子”。

TA貢獻1946條經驗 獲得超4個贊
嘗試通過重構代碼來消除getter。如果只有極少數其他東西需要Something,請使用友元函數或類。
通常,Getters和Setter打破封裝,因為數據暴露給世界。使用friend只會將數據公開給少數幾個,因此可以提供更好的封裝。
當然,這并不總是可能的,所以你可能會被吸氣劑困住。至少,大多數或所有“非平凡的代碼塊”應該在一個或多個私有函數中,由兩個getter調用。
- 3 回答
- 0 關注
- 499 瀏覽
添加回答
舉報