Monthly Archives: March 2011

private constructor? 静态工厂?

今天卡在了这样一段代码里: Thread ** m_ppThreads;      (code 1) …… m_ppThreads = new Thread*[NUM];    (code 2) 其中,Thread是一个构造函数为private的类: class Thread{ private: Thread(…….) { …… } public: Thread * create_obj(……) { …… } …… }; 由于Thread类的构造函数是私有的,因此只能通过其提供的一个静态函数接口创建该类的对象。 对于code 2,我感到疑惑的地方在于:Thread类的构造函数函数是私有的,而new一个Thread数组是必定会调用Thread类的构造函数,这样会造成编译时出错。实际上,code 2所做的并不是new一个Thread数组,而是new一个Thread类的指针数组,new的是指针而不是类。因此,code 2并不会出错:-) 附注: 在网上搜索了一下关于private constructor的资料,发现这种奇怪的类是专用于实现设计模式(design … Continue reading

Posted in TECH | Leave a comment

偶遇字节序

一直没有搞懂某个脚本的这句代码: printf “\x01\x00\x00\x00” > $out_file 运行时,其作用是将一个4字节整数1写入文件中。 od -N4 -tx1 $out_file,以一字节十六进制dump数据,看到输出结果为: 0000000 01 00 00 00 与输入顺序相同。 od -N4 -tu4 $out_file,以四字节无符号整型dump数据,则结果为 0000000 1 明显与输入顺序不同,因为输入是01000000。其值绝对可能是1。 今天请教高手后发现,原来是字节序的问题。 似乎除IBM的CPU外,大部分机器CPU都是小端字节序,包括INTEL。 小端字节序在解析时从高位开始。例如,内存中4字节如下分布: 地址:01 02 03 04 内存:01 00 00 00 那么小端字节序CPU以4字节整型解析该段内存数据时,得到的值为00000001。即先从地址04开始,往小地址读4字节。 相反,大端字节序解析得到的值为01000000。即先从小地址01开始,往大地址读4字节。

Posted in TECH | Leave a comment

随手写的简单队列

昨晚一个偶然的机会,随手写了一段队列代码。很久没有写过data struct的代码,写出来后错漏百出。经过几番修改,应该可用了。 队列需要实现以下几个功能: 1. 删除给定节点; 2. 获取队列节点个数; 3. 获取队首节点。 代码如下: class Queue { public:    ///@brief 从队列链表中移除一个Elem     void Remove(Elem* elem)     {    if (elem == NULL)   {    ///TODO 出错处理    return;   }      if (m_count == 1)   {    //队列只有一个元素    m_head … Continue reading

Posted in TECH | Leave a comment