看板 C_and_CPP 關於我們 聯絡資訊
最近在寫程式的時候遇到個小問題 #include<stdlib.h> #include<stdio.h> class MyClass { public: MyClass() { mImpl=new Impl(); } void SetNum(int num) const { mImpl->num=num; } private: class Impl { public: int num; }; Impl *mImpl; }; int main(int argc, char *argv[]) { MyClass* mc=new MyClass(); mc->SetNum(100); } 在member function中加入const不是應該就是為了表示這個函式不會更改值嗎? 可是以這樣的寫法來說卻是通過的,雖然我們的確是沒有更改mImpl的值。 但是這樣會不會有點不合邏輯,如果.cpp和.h分開寫 使用者只看的到void SetNum(int num) const會不會充滿滿滿的疑惑? 既然要設定num的值又設定為const函式這樣 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 121.254.69.174 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1424809447.A.FBD.html
MashiroKinji: SetNum()我知道本來就不需要const只是打個比方 02/25 04:29
AWEN221: 指標受常量規範時只保證指向的位址不變 02/25 07:30
AWEN221: 無法限制該位址的值不變 02/25 07:31
CaptainH: 會以為num是mutable 02/25 08:18
shadow0326: conceptual constness很難用編譯器檢查 02/25 11:28
littleshan: 某些語言具備transitional const可以檢查出這種狀況 02/25 12:06
littleshan: 不過C++並沒有這樣做,所以你得要自己注意 02/25 12:07
Killercat: 這是編譯防火牆最令人詬病的缺點 目前是無解的 02/25 13:50
Killercat: 應該說沒有一個簡單的解法啦.... 02/25 13:51
Killercat: 我們能做的只有盡量在簽名上面不要去迷惑使用者 02/25 13:53
MashiroKinji: 看來C++真的是很危險的語言... 02/25 20:09
PkmX: 你可以寫一個具有transitive const特性的smart ptr 02/25 20:27
PkmX: http://ideone.com/9CCb6Y 02/25 20:54
PkmX: 其實我後來覺得應該讓他變成smart ptr的wrapper就好 這樣底 02/25 23:51
PkmX: 層不用unique_ptr也OK 02/25 23:52
PkmX: left as an exercise for readers (?) 02/25 23:52
Killercat: 也不能說危險,你用編譯防火牆本來就該知道限制是什麼 02/26 08:17
Killercat: 這是一種tradeoff,所以我說寫C++的經驗很重要 02/26 08:18
Killercat: 不過能猛然發現這問題也算滿不錯的了.... 02/26 08:19
Killercat: 另外你真的很想要transitional const的話 除了PkmX的 02/26 08:20
Killercat: 寫法以外 你可以試試看以「維持pImpl class const」方 02/26 08:21
Killercat: 向思考,把裡面的東西都弄出getter and setter 02/26 08:21
Killercat: 這麻煩到爆,但是可以相對簡單的解決一部份問題 02/26 08:21
littleshan: 就 const 這點來說,C++ 比 Java 或 C# 安全多了 02/26 10:45
uranusjr: C++ 很危險, 但這不是例子, 很多語言連 const 都沒有 02/26 16:57
suhorng: 因為沒有 mutation 的概念(炸 02/26 16:58
MashiroKinji: 最後決定買本primer來看了..不過他的教的順序跟其他 02/28 05:24
MashiroKinji: 跟其他的C++書順序差好多真的適合新手入門嗎?? 02/28 05:26
uranusjr: 你都會 class 和 pimpl 也不算純新手了吧, 有點自信 02/28 14:48