问:在C++类的成员变量中定义一个常量数组?或者实现类似的功能?

xiaopoy 2011-09-02 04:12:46
这个问题和使用类的成员变量作为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分帖子才想起来自己的问题而发的。
...全文
819 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaopoy 2011-09-03
  • 打赏
  • 举报
回复
哈哈。上面的诸位提出的方法,我就像讥讽自己那样来一番了,但也还是丑陋的啊。

需要做到的是二件事,
1是可以进行初始化的const数组类型的成员变量。
2是sizeof的应用。

#3的方法非常强悍 :P 我是个笨蛋,竟然从来没想过static一下。但还是有sizeof的问题,有没有别的办法让sizeof( Array_Name)可以动态的得到{}中的元素的数量呢?
  • 打赏
  • 举报
回复
"不知道你这个动态的得到{}中元素的数量"是一个什么意思?
如果利用#3楼得做法,那么数组的个数不都是固定了嚒?
如果需要产生动态数组肯定不能用静态数组(固定长度),可以利用指针!
我想不明白了,楼主为什么不容容器来实现数组的功能啊!
非要再这个上面纠结了!
不是STL中的容器可以满足相应的需要么?
PG 2011-09-02
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 pengzhixi 的回复:]

避开吃力不讨好的事
[/Quote]
++

建议:
采用非const array,将const上升到接口层。
z_snail_z 2011-09-02
  • 打赏
  • 举报
回复
帮顶!学习
limang89 2011-09-02
  • 打赏
  • 举报
回复
帮顶。。
  • 打赏
  • 举报
回复
2 可以考虑使用 数组的引用
	int a[5] = {1, 2, 3, 4, 5};
const int ( &b )[5] = a;
printf( "%d\n" , sizeof(b) );
  • 打赏
  • 举报
回复
1 可以使用thunk技术 atl里面有现成的代码可以抄
辰岡墨竹 2011-09-02
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 luuillu 的回复:]

C/C++ code

struct A
{
static const int arr[10];
};
const int A::arr[10]={1,2,3};
[/Quote]

在类的外面初始化就可以了。如果你是最新的VC7以后应该都支持。
如果是VC6只能用枚举模拟一下。
gykgod 2011-09-02
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 luuillu 的回复:]
C/C++ code

struct A
{
static const int arr[10];
};
const int A::arr[10]={1,2,3};
[/Quote]

正解 BTW:LZ是蛋疼
donwmufromdying 2011-09-02
  • 打赏
  • 举报
回复
没明白你的问题。我的理解是: 如果你想要类中有个成员变量具有全局变量的效果,那就
static Type T, 如果要常量就static const Type T.

如果你不想定义全局function做回调函数,那也可以定义在类里边,只要是static的
shaotine_wu 2011-09-02
  • 打赏
  • 举报
回复
不是很明白LZ的问题。不过如果要把常量数组放入类中,可以用3L的方法
至善者善之敌 2011-09-02
  • 打赏
  • 举报
回复
貌似想在类中赋值,只有STATIC const
turing-complete 2011-09-02
  • 打赏
  • 举报
回复
什么当当当?
pengzhixi 2011-09-02
  • 打赏
  • 举报
回复
避开吃力不讨好的事
luuillu 2011-09-02
  • 打赏
  • 举报
回复

struct A
{
static const int arr[10];
};
const int A::arr[10]={1,2,3};
job82824 2011-09-02
  • 打赏
  • 举报
回复
看了一遍也没看懂问题是啥,我太菜了哈:)

如果希望定义时赋值可以
enum {myConst = 100};

如果希望数组脚标越界访问时能给出提示,就得把数组用private给封死了,然后外界只能通过函数接口来实现访问。这样的话只要在接口函数里面判断和给出警告即可。
xiaopoy 2011-09-02
  • 打赏
  • 举报
回复
补充下,
这个问题和使用类的成员变量作为windows API的回调函数的问题
原句是
这个问题和使用类的成员函数作为windows API的回调函数的问题

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧