PTT
Submit
Submit
選擇語言
正體中文
简体中文
PTT
C_and_CPP
[問題] 關於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 ptr
http://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 也不算純新手了吧, 有點自信
繼續閱讀
Fw: [問卦] 為何常聽到有人說程式語言中文書誤他一生?
Zorich
[問題] visual studio 還原檔案位置
chairles
Re: [問題] directshow GetFormat SetFormat
TeaEEE
[問題] 如何把一個VC專案移植到LINUX上?
p52189
[問題] 韌體工程師的準備
forget2009
[問題] directshow GetFormat SetFormat
liang168
[分享] Coding & Life
sunhextfn
[問題] 結構與函式
hergay
[問題] putchar
linada1230
[問題] 一個新手printf問題
q10242
Links
booklink
Contact Us: admin [ a t ] ucptt.com