首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

STL中_Container_base_secure:Myfirstiterator为什么是public,该如何解决

2012-02-05 
STL中_Container_base_secure::_Myfirstiterator为什么是public我用的是 VS2008。看到 std::_Container_bas

STL中_Container_base_secure::_Myfirstiterator为什么是public
我用的是 VS2008。
看到 std::_Container_base_secure
中的 _Myfirstiterator 是public 的,表示不理解。
见以下代码

C/C++ code
deque<int>::iterator p; //声明一个全局迭代器 pvoid dosomething(){    deque<int> myDeque;    myDeque.push_back(0); //压入一个元素0    p = myDeque.begin();    cout<<*p<<endl; //输出*p,没问题    myDeque._Myfirstiter = 0;     //因为_Container_base_secure::_Myfirstiter是public的,    //就可以直接就可以置0,这样太不安全了吧。}int main(){    dosomething();    if(p._Has_container())    {//此句判断成功,都是myDeque._Myfirstiter = 0;惹的祸,没有把p._Mycont置0        cout<<*p<<endl;                        //此句很有风险,因为原来dosomething()中的myDeque内存部分已经被置为不可用了    }    system("pause");    //即时上面的cout<<*p可以侥幸运行,这里的对迭代器p的析构也会出问题。} 


既然_Container_base_secure::_Myfirstiter为public可以因为这样的乱用
而造成隐患,它为啥还是 pulic 的呢?


我才学STL,不太理解,请前辈们指点指点。

[解决办法]
想了想lz的代码,没有觉得有什么不安全的,理由如下。
_Myfirstiterator的含义是这个deque的第一个元素吧,本来deque里面的所有的元素你就是可以取出来的,如果你定义的不是const,值也是可以改变的,你自己定义一个iterator,然后指向这个值,然后再改这个值,跟你直接改deque里面的这个值,有什么本质的区别吗?我看是没有的。

另外一点是,lz不要觉得成员变量就一定是private的,这一点在stl reference那本书里面就写得比较清楚了,pair的实现就是用的struct,有些实现就是要用public的,因为没必要private。

不知道我答清楚没有
[解决办法]
这种用法关键在于你怎么去控制了
 
正如deque中有front()成员函数(进行了重载),一个返回refrence,另外一个返回const_refrence
这个调用看你的控制,如果你用一个普通的refrence你就可以设置这个值,你调用第二个久只是只读了(这和你接受的变量的属性是否是const有关)
[解决办法]
这些是需要你自己去控制的,就好比你要故意对end()返回的迭代器进行解引用一样.明知有风险确要去做.

热点排行