2016-08-16 39 views
-1

我有一個類A和一個成員函數f,即返回指向 實例的一些內容設計兩個等價成員函數返回一個const和非const指針到構件,分別

int* A::f() { 
    // common code ... 
    return &(this->some_container[some_index]) 
} 

現在,我需要模擬功能,只返回一個指針const, 即

const int* A::f_const() const { 
    // exactly the same lengthy code ... 
    return &(this->some_container[some_index]); 
} 

需要注意的是,隨着「冗長的代碼」不改變0123實例, 這也使得功能const w.r.t.該實例(第二個 const聲明)。

我的問題:現在我不知道是否有一些解決方案,以避免代碼 加倍,不使用第三個功能

一方面,呼籲ff_const將是非法的,因爲fconst w.r.t.擁有的實例。另一方面,在f內部調用f_const 將需要將const指針轉換爲非const 指針,這也是不可能的。

有沒有優雅的聲明方法,避免代碼翻倍?

如所述,這裏使用具有ff_const共同功能的第三個功能是不是一種選擇,因爲當施加大量 功能,它將使碼的可讀性。

+1

可能的重複[如何刪除類似的const和非const成員函數之間的代碼重複?](http://stackoverflow.com/questions/123758/how-do-i-remove-code-duplication-between -similar-const-and-non-const-member-func) – Rakete1111

+0

你爲什麼要這樣做?人們永遠不會想到人們遇到的無窮無盡的C++問題。斯特勞斯特魯普博士從來沒有打算爲他的「語言」的「實際笑話」(只問他)作爲一個基礎來擺弄關於什麼機制可能導致某些意想不到的或無用的因素的副作用的哲學論證語義。當然,您可以將數據複製到靜態標量並返回其地址,該地址應該保持不變:-) –

回答

0

我想前提的答案可能取決於特定的上下文(例如函數的長度代碼,返回類型等)。

一般來說,對於我的經驗來說,最實用的,即使可能有點難看,解決方案是const cast operator

只是爲了實現常量方法,並在非const其他方法轉換得到它。例如:

const int* A::f_const() const { 
    return &(this->some_container[some_index]); 
} 

int* A::f() { 
    return const_cast<int*>(f_const()); 
} 

這通常是安全的,因爲你是類本身的設計者。

+0

感謝您的建設性答案。看起來'f_const'的實現忽略了一個成員。它應該只是'this-> f_const()'還是'this'也需要以某種方式流傳? – flonk

+0

@flonk對不起,我不明白你的意思。你可以試着再解釋一遍嗎? –

+0

對不起,我無法表達一些沒有任何意義的東西,你的回答是完全正確的:) – flonk

相關問題