自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(32)
  • 收藏
  • 关注

原创 C++的愤青

C++98中曾经的一些stl class的接口过于晦涩,例如最最最基本的string,其接口简直可以说是摧残人性。C++的list等几乎所有需要分配额外node的容器都是通用的,但是并非高效率的,在高性能的情况下并不适合,不如使用linux中的list_head这种预先需要被插入元素有特定数据成员的方法,简洁,高效仍不失为一种优雅。C++0x 新增加的一些libs越来越沦为一些C++语言Gur

2006-11-26 13:26:00 2701 4

原创 SlickEdit 一些使用技巧

SlickEdit 使用了几天以后,发现不仅仅是自动提示,代码浏览,它提供的编辑功能也非常强大。如果说 SourceInsight 和 SlickEdit  在浏览代码上面各有所长,那么编辑这方面 SE 和 SI 就不是一个级别了。下面是我知道的一些使用技巧,老鸟就不用看了,哈哈.1. 如果发现路径的/显示成了中文的¥字符,那么可以设置一下字体就可以了如果在XP下,直接将所有的字体

2006-08-05 12:13:00 22727 1

原创 SlickEdit C/C++开发的利器

 个人使用最熟悉,感觉也最好的C/C++ IDE环境是VC6+Visual Assist的组合,非常稳定,速度快,快捷键简单实用,界面简洁大方,几乎不需要使用鼠标进行任何操作,源代码直接的跳转也很舒服。不过如果工程文件不能在VC下编译,浏览功能就失效了,因为VC需要首先编译,然后生产一个BSC文件。如果不能编译,几乎就不能浏览。VS2003很早试用过几天,实在受不了它的“VB Friendly

2006-07-30 12:30:00 15127 3

原创 symbian 下 APP 中使用 singleton

下面这个是基于Noka 中的"tip of this month"中提供的一个例子而实现singleton的另外一种方式:#include templateclass DefaultCreator{public:    static T * Create()    {        return new (ELeave)T;    }};template >class CStaticData :

2005-09-28 20:58:00 2045 1

原创 symbian中的模板函数用于得到AppUi/Document/Application

symbian的app没有全局数据, 一个做法是将它这些全局数据放在你的Document类或者AppUi类或者Application类中. 这些类都是全局唯一的.Symbian提够了一些宏 , 例如iAvkonAppUi, iAvkonViewAppUi 等等, 但有时候我们需要得到我们"自己的"AppUi对象, 自己的Document对象等. 下面的3个模板函数可以解决这些问题. templat

2005-09-23 20:22:00 2008 12

原创 symbian 的c++ sdk

个人牢骚, 无知者无畏.在操作系统API这个层面上, 使用C++, 其中的面向对象的最重要的元素还不是多态, 而是封装, 也就是绝缘.Symbian在这个层面上远远不够,特别在它的UI框架中, 经常一个class N多长长的virtual 函数, 使得开发者无所适从,N多protected成员变量, 你说我派生自它,到底用还是不用了. 给赋个null行不行? private 成员变量就算了, N多

2005-09-22 21:37:00 2166 4

原创 C++中的auto_ptr (修改版本)

stl 文件中的 std::auto_ptr 在C++中的故事特别多, 在它的演变过程中至少出现了3个版本.http://www.josuttis.com/libbook/auto_ptr.html 这个连接里面有它完整的故事. VC6中STL带的auto_ptr( 带owner字段)的版本应该就是文中说的Version 2. 最新的Version里面包含了一个auto_ptr_ref, 这个是

2005-09-09 14:20:00 4893 3

原创 boost 1.33 仍然没有network library

boost 1.33 出来了, 仍然没有我期待很久的network library. boost中, 有不少是语法甜头, 或者接近语法甜头, 例如lambda, bind, assign, tuple等等, 不过不要小看这些甜头, 有时候, 例如bind的存在, 可以影响整个library的设计.regexp library据说是boost中用得最多的一个库, 它就是一个比较实用的utility

2005-08-17 11:39:00 2861 4

原创 不要使用VC6自带的STL

今天一个VC6.0的程序折腾了一天, 最后实在无法定位错误, 只好使用VC7.1编译, 结果一切OK.由于程序中使用了不少STL的东西, 特别是容器等, 于是怀疑是VC6.0自带的STL问题, 于是又使用STLPort + VC6.0 编译了一次, 一切OK. 具体问题还不容易定位, 不过这个程序并不是我写的, 而是网上的一个例子程序, 应该也经过了很多人的测试. VC6自带的STL毛病多多, 包

2005-08-16 19:40:00 4060 4

原创 C++ 在库中处理错误的一种方法

处理错误, 特别是在library中, 一直是一件麻烦的事情. library知道错误发生了, user知道如何处理这种错误, 但是问题是, library的作者不知道 user 想如何处理错误的. 通过返回值, 抛异常, 直接abort? 一般来说, 抛异常是最常用的一种方法, 但是某些情况下并不合适. 例如当发生错误是可以预计的, 并不是一个"异常事件"时, 或者简单的就是不能使用异常.一种更

2005-08-16 14:06:00 1902

原创 Boost.Test

关于测试驱动开发,  C++的库比较多, 选择是一个问题.Boost.Test是一个用于C++开发的测试框架, 类似的还有CPPUnit, 个人认为, CPPUnit过多的照搬了JUnit的框架, 有比较浓厚的Java风格, 用起来总感觉有些束缚, 不是那么native. CXXTest 我用过Symbian版本的, 好像需要Perl, 不过Symbian本身安装的时候就需要Perl, 因此对于S

2005-08-10 16:47:00 3632

原创 Symbian 的 TCallBack

symbian中的一些API接口都需要一个TCallBack类型的参数作为回调函数使用, 如果你需要指定到一个类的成员函数, 一般我们要写一段套路代码,1.  先定义一个静态函数, 接收一个void*指针, 2.  然后在这个函数中将这个指针转换成某个class的指针, 然后调用class中的某个成员函数, 例如 class  CFoo {   void start_timer()  {    i

2005-07-28 15:42:00 2364

原创 Symbian 智能指针

 在Symbian开发过程中, 由于没有确定性析构, 最让人烦躁的就是Cleanup Stack的操作, 当在一个函数中使用局部变量时, 要记得PushL, 然后在函数末尾, 还要PopAndDestroy, 变量一多, 头昏脑胀,都找不到北了, 经常被Panic, 而且在VC6窗口中还不知道到底是哪行的问题, 只能单步调试, 一直到程序crash. 然后知道上一行就是问题所在.下面是我写的一个智

2005-07-14 11:12:00 3078 6

原创 我喜欢Symbian

Symbian 是Nokia,爱立信等高端PDA手机中常用的一个操作系统, 原生的SDK是C++, 所有的API都是直接使用C++语法, 当然为了兼容的原因, 仍然提供了标准C library, 不过功能并不完善, 在symbian中也不推荐使用, 不过我觉得用也无妨,, 因为C的接口比较简单. Symbian是一个比较陈旧的操作系统, 使用C++开发的时间大概在90年代早期, 基本上没有用到什么

2005-07-12 11:15:00 2232 5

原创 简单但还比较实用的模板技术

今天上google, 结果搜到 codeproject 上的一个关于写Windows 注册库的文章http://www.codeproject.com/system/registry_value.asp#xx1111845xx真正大开眼界, 其中使用的模板技术很"直白", 不想boost那样复杂, 但是又很好地和实际开发结合起来了, 结果在代码中写注册库及其简单, 估计即使是开发一个script语

2005-07-08 18:13:00 1963

原创 人与继承的C++实现

allaboutprogram 上面的一个帖子:如果上帝是程序员,我们每个人不用说了,肯定是人的每个实例,但是上帝会把人定义为接口呢还是类?究竟我们是继承了人这个基类,还是实现了人的接口?人妖这个类怎么就能变过来了?双胞胎怎么生成的?连体婴儿呢?我的看法是:人是类, 而不是接口, 有些东西人是天生就有的, 因此人应该是类.人妖属于保护继承, 隐藏了一些细节, 同时也覆盖了某些函数. 既然是prot

2005-06-27 11:59:00 1663 3

原创 C++ Templates (给模板参数命名2)

上面那个帖子的实现手法不太好, 当client使用的时候, 还是需要 BreadSlicer, Policy2_is > bc;复杂的嵌套模板语法, 如果能够去掉PolicyN_is, 例如可以这样 BreadSlicer如果定制其中的policy2, 这样 BreadSlicer bc;如果需要定制2, 3, 这样 BreadSlicer bc;与顺序无关, 先写3, 再写2也可以 BreadS

2005-06-27 09:49:00 1758

原创 C++ Templates (给模板参数命名)

看C++ Templates 16.1 Named Template Arguments书中的例子实现手法使用多重/虚拟继承, 实现手法感觉比较诡秘. 但是至少告诉我是可以实现的. 于是干脆自己也练了练手,  博君一笑. 只在VC7.1下测试过, VC6也许可能可以迂回实现, 但是估计工作量太大. 1. 首先需要一个基本的 If 语句. template struct if_{    typed

2005-06-26 16:44:00 1955 3

原创 C++ Templates

又发现一个诡秘的地方模板派生类(下面的D) 从一个 确定性基类(指B)继承, 在D的定义中, 编译器优先查找基类中的名字, 然后才是模板参数placeholder (即Type) .例如:struct B{   typedef int Type;        //基类中有一个Type名字};templateclass D : public B           //从非依赖基类B派生, {pu

2005-06-24 17:22:00 1453 1

原创 C++ Templates 的一个例子

C++ Templates 中的一个例子:一个模板基类templateclass Base{public:   int field;       // #1};派生类, 从上面的模板基类继承注意, 在此, 基类并不能确定就是上面的Base, 因为 下面#3 处可以看到, 程序对Base进行了特化templateclass Derived : public Base{public: void f(

2005-06-23 15:36:00 2838

原创 C++ 的MetaProgramming 入门篇(2)

上回说到一个fac的版本, 希望在负数的情况下返回-1, 而不是无限递归下去. 还是按照我们的思维, 先写个对应"运行时世界"的版本.int safe_fac(int n){  if( n      return -1;  return fac(n);}这个if逻辑很简单, 如果模板参数好, 转换成我们的meta 版本.你想,用个 ?: 运算符不就解决了吗? templatestruct safe

2005-05-24 10:30:00 1691

原创 C++ 的MetaProgramming 入门篇

C++ 的另一个新世界C++ 的 MetaProgramming 废话就不说了, 按照C的传统惯例,介绍programming的最好方式就是show代码, 第一个例子就是Hello,world, 这篇文章也不例外在任何一个cpp文件中,输入struct hello_world; //forward declarationstruct A : hello_world{};然后编译..,注意我没有说"

2005-05-23 13:31:00 2932 1

原创 伟大的DCOM解决方案

MS的COM以及其后提供分布式对象支持的DCOM/COM+技术现在仍然被广泛使用,不过官方说法它的未来应该是.Net,.Net有多好我不知道,DCOM有多烂到时略知一二,特别是对应Visual Basic的实现。 COM的前身是OLE,主要用于解决Office多文档之间的协作,OLE本身及其复杂,有部分是本质复杂性的原因。总的来说还可以接受。不过其后为了给COM增加位置透明以及运用在后台组件的开发

2005-04-18 11:46:00 1743 2

原创 为什么说MFC是垃圾

本来是原创文章,发表与论坛,增加修改了一些东西。我说MFC设计得不好, MFC最重要的一个class应该是CWnd,对吧?  一个CWnd多少个字节? 我记得好像是64(60?)个字节。按照你的理解,可能4个字节的HWND以及最多虚拟函数需要使用的4个字节加起来8个字节就够了(ATL的CWindow只有4个字节,虚函数都没有,消息处理通过多层继承实现正交分解)。但是CWnd为什么有64个字节? 因

2005-04-15 13:21:00 5962 28

原创 C++ 20年

 今天逛到到Herb Sutter的blog,提到C++自85年首次商业登场,今年就是20年了。  C++ Connections: 20 Years of C++"C++ Connections is a five-day conference event focused on practical C++ practice and experience, and that also celebr

2005-04-15 12:06:00 2072 2

原创 emacs 删除匹配的lisp语言

刚刚写lisp,最头痛的就是()  之间的匹配总算搞不清楚。虽然有个 (show-paren-mode 1) ,不过只有光标在()上才有效。尝试写了个函数,C-0 将光标所在的语句删除,再按一次恢复.(defun kill-paren ()  "kill matched paren in elisp, repeat undo the kill"  (interactive "*")  (if (e

2005-04-07 19:22:00 1340 1

原创 emacs 设置frame title为文件路径名

以前从网站上拉下来一个,不过使用了post-command-hook,参考修改了一下,能够比较及时显示。;;;Emacs title bar to reflect file name(defun frame-title-string ()   "Return the file name of current buffer, using ~ if under home directory"   (l

2005-04-07 19:07:00 1641

原创 自动在c++中插入成员函数 (emacs 扩展)

总算花了几天功夫看了一下elisp语言,括号看得头晕,安耐不住写了一个elisp扩展,现在感觉看一般简单的lisp也不是那么痛苦了。用法:可以在c++头文件中,将光标放在当前函数行,然后按C-c i在对应的源文件中插入成员函数。支持多层namespace 和 class。不过还不是十分可靠,例如对默认参数值的支持等。(defun cpp-current-scope()  "If the point

2005-04-07 17:04:00 1591

原创 C++ vs C 风格的字符串

在cdsn上看了一个帖子,谈到std::string的效率比不上c风格的char。因为std::string使用堆,而c风格的字符串数组在很多情况下可以直接使用栈上的空间,极大的提升了速度。在效率上,C++能够和C抗衡的一个有力武器就是模板template。我试着写成下面一个同样建立在栈上的c++风格的字符串类,效率应该也不错。下面是我的帖子:效率高的地方使用std::string当然不好,这个涉

2005-01-03 15:00:00 2231

原创 Symbian中的descriptor

好久没有写blog了,最近一直在symbian上开发,对symbian中的字符串进行了一点总结,格式没有编排,而且比较混乱,实在懒得整理了。TDesC本身只包含两个成员变量,type和length。type用于避免虚拟函数,length表示对象的长度。这样也就决定了symbian的descriptor是一个封闭的系统,即开发者无法再从系统提供的Descriptor class通过继承以扩展其功能。

2004-11-26 11:28:00 2364

原创 郁闷的VC7 IDE

vc7的开发环境我有几个地方特别别扭。1. Esc Esc Esc无法关闭Output等窗口,非要用鼠标去关,选择“autohide all”吧,它根据你当前的鼠标位置,又老是还没有来得及看就关了。我一直没有找到方法可以最大化editor window,不受那些小窗口的影响。2. Search in Files以后,F4无法像编译错误一样,跳动下一个找到的位置,又得用鼠标一个一个点。3.

2004-08-22 10:13:00 2301 8

原创 C++中的局部静态对象

一个简单的class T class T {public:  T()   {   value = 0x12345678;  }  ~T()  {   value = 0;  }  int value;}; 加上一个简单的foo函数,里面定义了一个静态局部对象: void foo(){    static T t;}   编译器展开后,实际上等同我们定义了 char tMemory[sizeof(T

2004-07-07 22:15:00 1305

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除