4 更好的使用标准库中的字符串类 (std::basic_string<class Char, class CharTraits, class Alloc>)
如果在一个实际的项目中要使用标准库的std::string 或 std::wstring,会发现随着时间的推移,越会产生出重写一个自己的字符串类之冲动,而std::string的接口如此之好用,同时code里到处是std::string这样的东西,有时又要向多字节字符转换。此处有一个比较好的方案,不过最好从项目开始就实施:
typedef unsigned char UChar;
typedef unsigned short UWChar;
typedef std::allocator StringAllocator; // 使得以后有针对字符串分配优化
typedef std::basic_string< UChar, std::char_traits<UChar>, StringAllocator<UChar> > String;
typedef std::basic_string< UWChar, std::char_traits<UWChar>, StringAllocator<UWChar> > WString; // 宽字符版本
然后,在项目中就可以使用这个经过定制的String / WString。
5 函数名称重载是C++很好的特性,适当使用会带来很好的效果,有时却会自找麻烦,下面就是一例:
class EntityDefination {
public:
//...
Entity* GetEntity(const char* name);
Entity* GetEntity(const unsigned id); // 重载
};
自认为这样很好不是吗?
有一次,我写了这样一行代码:
Entity* result = entDef->GetEntity(0);
知道,发生什么事吗,这是个对GetEntity(const unsigned id)的调用,虽说这是一行测试代码,但足以说明我的类接口上的信息缺了些,遂做了如下改动:
Entity* GetEntityByName(const char* name);
Entity* GetEntityByID(const unsigned id);
然后,看看:
Entity× result = entDef->GetEntityById(0); // 哈哈!错误一目了然,眼睛调试 :)
(to be continued!)