[问题] 关于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