代码改变世界

c++ note

2012-12-16 10:33  robturtle  阅读(482)  评论(0编辑  收藏  举报

咳咳,准备清理NTFS分区啦,把分区里的一些笔记整理出来

初学c++ 类的设计参考 (MFC style)

template<typename T>
class cClassName                //使用小写c前缀主要是为了避免类名与MFC的类混同
/*:public BaseClass*/{
public:
    //*********constructor**********
    DefaultConstructor(void);
    CopyConstructor(cClassName&);        //如果用到动态内存应重载 copy constructor
    virtual Deconstructor(void);         //如果用到虚方法则应加 virtual 前缀
    //*********operator*************
    friend T operator<<(args);           //声明为友员函数是因为运算顺序的关系,如果是成员函数则运算顺序与习惯相反
    friend T operator+(args);            //声明为友员函数是因为参与运算的可能有其他数据类型,此时应重载该类型的 constructor
    cClassName& operator=(args);         //必须为成员函数
    //*********members**************
    T InterfaceFunc(args);
    inline T GetMemberData(args) const;  //用内联常函数访问成员变量
    static const T Flag;                 //自定义标识符
protected/private:
    T m_tMmbDat;                        //典型的 MFC 命名方式,好处是可以方便地区分成员变量,坏处是冗长而且会被 linuxer 耻笑
}                                       //不过,需要这样区分成员变量吗?
const T Flag = __value;                 // static 变量在类外定义

2012年7月 VS2008 中迭代器的使用差别

在VS2008中,如果使用传统的方式遍历list的话,会报出assert_error:"list iterator not dereferencable!". 一般传统的方式是:

list<TYPE>::iterator p = list.begin();
while(p!=list.end()){ do_sth; p++}
显然在遍历的过程中多了一个p++,在一般的list实现中,尾部的iterator自加后会指向链表头,但在VS2008的list实现中则添加了以下assert语句:

if (this->_Mycont == 0
        || _Ptr == 0
        || _Ptr == ((_Myt *)this->_Mycont)->_Myhead)
{
        _DEBUG_ERROR("list iterator not dereferencable");
        _SCL_SECURE_TRAITS_OUT_OF_RANGE;
}

以此避免了迭代器从头开始循环。我把'|| _Ptr == ((_Myt *)this->_Mycont)->_Myhead)'这句注释掉之后,原来的方法可以正常使用。