簡體   English   中英

如何在參數non-const中傳遞const指針

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM