[問題] 關於Pimpl和const的問題

看板C_and_CPP作者 (MashiroKinji)時間10年前 (2015/02/25 04:24), 編輯推噓7(7022)
留言29則, 9人參與, 最新討論串1/1
最近在寫程式的時候遇到個小問題 #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

02/25 04:29, , 1F
SetNum()我知道本來就不需要const只是打個比方
02/25 04:29, 1F

02/25 07:30, , 2F
指標受常量規範時只保證指向的位址不變
02/25 07:30, 2F

02/25 07:31, , 3F
無法限制該位址的值不變
02/25 07:31, 3F

02/25 08:18, , 4F
會以為num是mutable
02/25 08:18, 4F

02/25 11:28, , 5F
conceptual constness很難用編譯器檢查
02/25 11:28, 5F

02/25 12:06, , 6F
某些語言具備transitional const可以檢查出這種狀況
02/25 12:06, 6F

02/25 12:07, , 7F
不過C++並沒有這樣做,所以你得要自己注意
02/25 12:07, 7F

02/25 13:50, , 8F
這是編譯防火牆最令人詬病的缺點 目前是無解的
02/25 13:50, 8F

02/25 13:51, , 9F
應該說沒有一個簡單的解法啦....
02/25 13:51, 9F

02/25 13:53, , 10F
我們能做的只有盡量在簽名上面不要去迷惑使用者
02/25 13:53, 10F

02/25 20:09, , 11F
看來C++真的是很危險的語言...
02/25 20:09, 11F

02/25 20:27, , 12F
你可以寫一個具有transitive const特性的smart ptr
02/25 20:27, 12F

02/25 20:54, , 13F
02/25 20:54, 13F

02/25 23:51, , 14F
其實我後來覺得應該讓他變成smart ptr的wrapper就好 這樣底
02/25 23:51, 14F

02/25 23:52, , 15F
層不用unique_ptr也OK
02/25 23:52, 15F

02/25 23:52, , 16F
left as an exercise for readers (?)
02/25 23:52, 16F

02/26 08:17, , 17F
也不能說危險,你用編譯防火牆本來就該知道限制是什麼
02/26 08:17, 17F

02/26 08:18, , 18F
這是一種tradeoff,所以我說寫C++的經驗很重要
02/26 08:18, 18F

02/26 08:19, , 19F
不過能猛然發現這問題也算滿不錯的了....
02/26 08:19, 19F

02/26 08:20, , 20F
另外你真的很想要transitional const的話 除了PkmX的
02/26 08:20, 20F

02/26 08:21, , 21F
寫法以外 你可以試試看以「維持pImpl class const」方
02/26 08:21, 21F

02/26 08:21, , 22F
向思考,把裡面的東西都弄出getter and setter
02/26 08:21, 22F

02/26 08:21, , 23F
這麻煩到爆,但是可以相對簡單的解決一部份問題
02/26 08:21, 23F

02/26 10:45, , 24F
就 const 這點來說,C++ 比 Java 或 C# 安全多了
02/26 10:45, 24F

02/26 16:57, , 25F
C++ 很危險, 但這不是例子, 很多語言連 const 都沒有
02/26 16:57, 25F

02/26 16:58, , 26F
因為沒有 mutation 的概念(炸
02/26 16:58, 26F

02/28 05:24, , 27F
最後決定買本primer來看了..不過他的教的順序跟其他
02/28 05:24, 27F

02/28 05:26, , 28F
跟其他的C++書順序差好多真的適合新手入門嗎??
02/28 05:26, 28F

02/28 14:48, , 29F
你都會 class 和 pimpl 也不算純新手了吧, 有點自信
02/28 14:48, 29F
文章代碼(AID): #1KxDtd-z (C_and_CPP)