2 gxf0k0k gxf0k0k 于 2014.05.21 09:25 提问

c++写入位置时放生访问冲突
c++

struct B{
B* bbbb;
int* nInt;
};

class Test{
public:
static const B Testb;
};

const B Test::Testb = {NULL, NULL};

int main()
{
B* bb = (B*)&Test::Testb;
bb->nInt = NULL; // 这时会出现访问冲突 我感觉是类静态变量的问题
bb->bbbb = NULL; // 是不是不能更改 全局静态区的这个变量的地址呢??求解
return 0; //
}

1个回答

lym753024200
lym753024200   2014.05.21 11:14

类中的静态const成员必须在类里面一开始就赋值,因为static类型是在编译时候就要分配地址,并且赋值为0的,而const类型是不允许再次更改其值的,组合起来就是一开始就要赋值。

gxf0k0k
gxf0k0k 啊~!!我终于明白了 记得老师以前讲过类似的 我根据你的提示 又测试了下 主要还是因为 我这个对象是在全局静态区 所以我虽然可以更改指针的const属性 但是还是改不了内容 但如果这个对象是栈内的 则我可以通过这个指针绕过对象的const属性进行更改。。。但是具体为什么对象保存的位置不一样导致这个问题 我还不是很了解
3 年多之前 回复
lym753024200
lym753024200 static const B Testb中去掉const
3 年多之前 回复
lym753024200
lym753024200 非const指针式不能指向const变量的,你忘记了?!。。
3 年多之前 回复
gxf0k0k
gxf0k0k 这是我的一个测试程序 原来的问题是想模仿mfc的RTTI机制练习 但是出了一样的问题 我这个main函数里的只是一个指针的转换 应该不会调用构造函数吧。。 主要是这个指针已经是非const的了 为什么还是不能修改对象的属性呢。。 我是通过指针去操作的 我最终是希望bb->nInt = NULL; 可以修改。但是不知道怎么弄 求助
3 年多之前 回复
lym753024200
lym753024200 这个转化只是将右值的一个副本转化成了左值,转化不改变右值。而且右值是一个类,这个类的创建会调用构造函数,构造函数由于会对静态成员赋值,就是产生错误。你这上面只是声明了一个结构和一个类,并没有定义具体变量,main()之前的语句不晓得你是在干啥。。。总体代码不知所云,语义问题大大的有!
3 年多之前 回复
gxf0k0k
gxf0k0k 嗯 是因为它被声明const所以不能更改 那我在main中把它的指针转为B*是没有意义的了? 这个是说bb这个指针可以更改,但是Testb里成员还是不能更改是吧? 请问这个时候我想改的话 应该怎么做呢
3 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!