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

作者: MashiroKinji (MashiroKinji)   2015-02-25 04:24:04
最近在寫程式的時候遇到個小問題
#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函式這樣
作者: MashiroKinji (MashiroKinji)   2015-02-25 04:29:00
SetNum()我知道本來就不需要const只是打個比方
作者: AWEN221 (Larry)   2015-02-25 07:30:00
指標受常量規範時只保證指向的位址不變無法限制該位址的值不變
作者: CaptainH (Cannon)   2015-02-25 08:18:00
會以為num是mutable
作者: shadow0326 (非議)   2015-02-25 11:28:00
conceptual constness很難用編譯器檢查
作者: littleshan (我要加入劍道社!)   2015-02-25 12:06:00
某些語言具備transitional const可以檢查出這種狀況不過C++並沒有這樣做,所以你得要自己注意
作者: Killercat (殺人貓™)   2015-02-25 13:50:00
這是編譯防火牆最令人詬病的缺點 目前是無解的應該說沒有一個簡單的解法啦....我們能做的只有盡量在簽名上面不要去迷惑使用者
作者: MashiroKinji (MashiroKinji)   2015-02-25 20:09:00
看來C++真的是很危險的語言...
作者: PkmX (阿貓)   2015-02-25 20:27:00
你可以寫一個具有transitive const特性的smart ptrhttp://ideone.com/9CCb6Y其實我後來覺得應該讓他變成smart ptr的wrapper就好 這樣底層不用unique_ptr也OKleft as an exercise for readers (?)
作者: Killercat (殺人貓™)   2015-02-26 08:17:00
也不能說危險,你用編譯防火牆本來就該知道限制是什麼這是一種tradeoff,所以我說寫C++的經驗很重要不過能猛然發現這問題也算滿不錯的了....另外你真的很想要transitional const的話 除了PkmX的寫法以外 你可以試試看以「維持pImpl class const」方向思考,把裡面的東西都弄出getter and setter這麻煩到爆,但是可以相對簡單的解決一部份問題
作者: littleshan (我要加入劍道社!)   2015-02-26 10:45:00
就 const 這點來說,C++ 比 Java 或 C# 安全多了
作者: uranusjr (←這人是超級笨蛋)   2015-02-26 16:57:00
C++ 很危險, 但這不是例子, 很多語言連 const 都沒有
作者: suhorng ( )   2015-02-26 16:58:00
因為沒有 mutation 的概念(炸
作者: MashiroKinji (MashiroKinji)   2015-02-28 05:24:00
最後決定買本primer來看了..不過他的教的順序跟其他跟其他的C++書順序差好多真的適合新手入門嗎??
作者: uranusjr (←這人是超級笨蛋)   2015-02-28 14:48:00
你都會 class 和 pimpl 也不算純新手了吧, 有點自信

Links booklink

Contact Us: admin [ a t ] ucptt.com