问:在C++类的成员变量中定义一个常量数组?或者实现类似的功能?
这个问题和使用类的成员变量作为windows API的回调函数的问题,是我头疼最久同时也毫无漂亮的解决办法的二个问题。
现在列出来,想看看各位同僚有没有好的招式:
首先摘抄一点自己做的c++的笔记,
类里面的任何成员变量在定义时是不能初始化的。 需要自己在constructor(构造函数)中赋值。
对于类的const成员变量,必须在构造函数的初始化列表中初始化好,不然无法赋值。但初始化表中,不能在变量之后的()中用{}来设置初始化的每个元素,因此C++类的成员变量中不能定义常量数组。
这个问题是很明了的,所以我就直接讲想要的效果,还有用过的丑陋的解决方法.
首先,肯定是想要让它是一个const,以达到在误操作的情况下可以提示的效果。
其次,sizeof( ArrayName_Type)来直接操作数组的元素数量,这样实在是省心又好看,还有好性能,所以需要一个可以直接可以操作元素数量的功能。
这个东西的表现是什么样的呢,也就是,为什么我们程序员要解决这个问题呢。
这要从c++的class的样子说起来,class,当然是封装好的独自作为一个整体的东西。而我们现在面临的这个类所使用的常量数组,它是个const,所以很硬,还是个数组,所以又很长,同时,你又没办法把它放到class里面。这样,总结起来它就是,一个"又硬又长同时露在外面的属于class的东西"。唔。
难道这东西被人看到的时候不是在我们的脸上左右开弓玩命扇吗?所以要解决它,必须解决。
1.用一个和类名称相关的namespace,把这个全局的常量数组保存进去,并把目标的class封闭到一个文件里,只在它的开头加上using。看起来很好啊,可问题是,就算你给它穿上衣服,它的模样还是那个样子的,而且最重要的是,还是把它露在外面的。
2.我们可以更简单些,在这个全局的常量数组前加上匪夷所思的一串东西,确保别的文件不会误用到它,比方Global_ClassNameSmallSecret_????这样的名字。不过,这般做的话,我们的问题更严重了,给你的那个东西上面写上名字,然后再露在外面,并不代表着它就不丢你的脸了啊!!!
3.所以我们一定要把这个东西塞进class里去。一定,没有办法初始化常量数组的情况下,我们在类里声明一个指向这个数组的开首位置的指针,同时声明成这个指针是const的又指向的也是const的数据, const ArrayType * const,只要在初始化的时候强制转换下const类型就好了,当然,为了sizeof的方式,因为不能用ArrayType ArrayName_Type[]= { 1, 2, 3, 4, 5}这样的格式来定义了,sizeof的需求要在初始化时,sizeof()一下那个构造函数里保存那串{}的临时数组,并保存它到类里的另一个const 变量里,或许还可以#define sizeof( ArrayName_Type) ARRAYNAMELEN; unsigned int ARRAYNAMELEN= sizeof( TempForArray_Type);当然,我是不会那样无聊的 :P 。 可是,伙计,伙计,再仔细想一下啊,你突然发现一个诱惑到爆性感的一塌糊涂的女的片的时候,你杀了自己也不会先套个An' Quan 套上去再自我安慰吧?而且当你看完后拼了老命(或者小命)的努力找女的名字的时候,也不可能喜欢突然闯进来的那谁谁吧(对sizeof( 女的) 感兴趣的那个谁谁)
嗯,我的好朋友,我的方法的确是丑陋到爆了吧,但我们要解决这个问题,你会怎么样做呢?不要看帖不回帖,请分享下嘛~
最后提一下,这个是因为看到那位仁兄的300分帖子才想起来自己的问题而发的。