[英]How to pass const pointer in parameter non-const
我在給定的代碼片段中有兩個指針(const Vec * a和const Vec b),我需要傳遞這兩個值,這些值在代碼中被實例化,用於沒有參數的函數(const Vec *)但只有(Vec *)。 如果不移動函數定義,我怎么能這樣做,但如果有必要,我應該采取什么程序?
//const Vec* from;
//const Vec* at;
Vec* viewVec;
viewVec = Vec::sub( view->at, view->from);
//static Vec* sub(Vec*, Vec*);
Vec* Vec::sub(Vec* a, Vec* b) {
return new Vec(a->x - b->x, a->y - b->y, a->z - b->z);
}
最簡單的答案可能是:“不要”。 如果你需要使用Vec *
而不是Vec const *
,那么就這樣開始聲明。
如果這是一些承諾不修改它的第三方函數但由於某種原因厭惡const
,那么其他人列出的const_cast
解決方案是你唯一的選擇(除了使用更好的第三方庫)。
如果你指向的指針所指向的std::vector
實際上不是const
(在它的聲明點),你恰好有一個引用它的std::vector const *
,那么它是'安全的'(但是仍然通常是不明智的)在它上面使用const_cast
。 但是,如果修改最初聲明為const
任何變量,則它是未定義的行為。 例如,編譯器可能會看到你在std::vector const
上做了多次昂貴的操作,而且它可以自由地緩存結果的某些部分,因為它可以假設它總是處理相同的事情,所以如果你改變它,你可能得到不正確(甚至不一致)的結果。
你可以使用const_cast
,例如
viewVec = Vec::sub(const_cast<Vec*>(view->at), const_cast<Vec*>(view->from));
你是否應該是另一回事。 如果你真的無法改變函數的簽名(這可能是最簡單的修復),你總是可以編寫一個包含狡猾的轉換的包裝器 - 這樣,至少調用者不需要自己進行任何轉換:
Vec *Vec::sub(const Vec *a, const Vec *b) {
return sub(const_cast<Vec*>(view->at), const_cast<Vec*>(view->from));
}
const_cast<type>(value)
你去;)
正如人們提到的,你可以使用const_cast
。 您必須小心這樣做的原因是您最終可能會修改不應修改的內容。 例如,如果某個對象將指針聲明為const
那是因為它希望確保此指針不能更改。 如果你然后const_cast
指針並將其傳遞給另一個函數,另一個函數可以使它指向一個新的東西,因此擰緊試圖保護它的原始對象。
特別是,如果對象A分配了const指針所指向的某段內存,該怎么辦? 如果你然后通過const_cast
將指針傳遞給一個函數,並且這個函數delete
了內存,或者重新alloc
它,那么原始的內存將會被取消刪除。
希望這可以幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.