亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

復制,常量和非常量,吸氣劑的優雅解決方案?

復制,常量和非常量,吸氣劑的優雅解決方案?

C++
慕尼黑的夜晚無繁華 2019-08-30 17:21:52
你有沒有恨它class Foobar {public:    Something& getSomething(int index) {        // big, non-trivial chunk of code...        return something;    }    const Something& getSomething(int index) const {        // big, non-trivial chunk of code...        return something;    }}我們無法使用另一個方法實現這兩種方法,因為您無法const從const版本中調用非版本(編譯器錯誤)。演員將被要求const從非const一個版本調用該版本。有沒有一個真正優雅的解決方案,如果沒有,最接近一個?
查看完整描述

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());

    }

};


查看完整回答
反對 回復 2019-08-30
?
子衿沉夜

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文件中。在匿名命名空間中。內部聯系。還有一個標語“小心豹子”。


查看完整回答
反對 回復 2019-08-30
?
絕地無雙

TA貢獻1946條經驗 獲得超4個贊

嘗試通過重構代碼來消除getter。如果只有極少數其他東西需要Something,請使用友元函數或類。


通常,Getters和Setter打破封裝,因為數據暴露給世界。使用friend只會將數據公開給少數幾個,因此可以提供更好的封裝。


當然,這并不總是可能的,所以你可能會被吸氣劑困住。至少,大多數或所有“非平凡的代碼塊”應該在一個或多個私有函數中,由兩個getter調用。


查看完整回答
反對 回復 2019-08-30
  • 3 回答
  • 0 關注
  • 499 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號