记录一些项目中遇到的代码实现 / 编译 等问题


编译链接

使用初始化和使用赋值时,调用的函数不同;使用 auto_ptr() 时可能会出现编译错误

std::auto_ptr<Class> pClass(new Class());   // 这里调用的是 operator()()
std::auto_ptr<Class> pClass = new Class();  // 这里调用的是 operator=(),会报错

直接赋值会存在二级指针的问题

宏定义不受命名空间的约束

即两个头文件中有相同的宏定义,即使加了 namespace 也不能解决编译时 redefine 的问题

Switch-case 中不能定义变量

在 switch-case 中定义了变量,用 g++ 编译的时候报错

crosses initialization of “XXX”

变量定义在 case 中,gcc 会出现 "交叉初始化" (crosses initialization) 的错误,因为可以跳过对象的初始化,这个 "没有创建的对象" 依然在 switch 的作用域中

switch(k)
{
case 1:
int t = 4;
break;
default:
break;
}

将变量定义放在 switch-case 外就解决了

Getting a bunch of crosses initialization error

 

技巧/注意项

多层继承中基类的纯虚函数

多层继承中,若最底层的基类有定义纯虚函数,最好在每一层中都实现该虚函数,否则当产生多态时,可能当前基类没有函数符号导致编译错误

通过配置文件控制日志的输出

当输出调试相关的日志时,判断下该项配置

在用户环境可以关掉这个配置,相当于切换 debug 和 release 版本

工厂模式中的 context 类

工厂模式中,A 类产生的 B类,需要修改 A 类的内容;可以将 A 类中部分属性外包成成员变量 context;在 B 类中获取 context 指针即可

(任何计算机相关的问题都可以通过加一层解决)

尽量使用多态来代替类型判断

当需要对一个派生类进行特殊操作时,不应该去手动 if 判断类型,而是使用 虚函数/基类预设的成员变量,来在派生类重写虚函数 / 主动 set 成员变量,从而实现在运行时的类型不同而区分不同的行为

(前提是这个行为在派生类中拥有共性)

 

语法

多态在基类中仍生效

当一个派生类对象调用虚函数时,除非显式调用基类方法( Base::vfunc() ),否则其调用的虚函数取决于该对象的类型

bool THtmlEvalParser::Parse(const char * pHtml, const size_t nHtmlLen)
{
       // 这里显示调用了基类的 Parse 函数
       THtmlParserBase::Parse(pHtml, nHtmlLen, m_nMaxTreeNode); ... ...
void THtmlParserBase::Parse(const char * pHtml, const size_t nHtmlLen, size_t
nMaxNode)
{
... ...
      if( pCurrentPos < pTagBegin)
{
// 这里虽然是在基类的方法中,但是当前对象是派生类型,所以将调用的是 THtmlEvalParser 的 ParseContent
// (前提是 ParseContent 是虚函数且 THtmlEvalParser 重写了该函数)
             ParseContent(pCurrentPos, pTagBegin);
} ... ...

原因是在对象生成时,派生类重写的虚函数方法已经覆盖了虚表,当调用虚函数时需要查表,自然调用的是派生类虚方法的指针

string find

查找字符串 strA 是否包含子串 strB,不是用

strA.find(strB) > 0

而是

strA.find(strB) != string:npos;
// or
string::size_type pos = strA.find(strB);
if (pos != string::npos)
{
... ...
}

获取文件大小

TFile 里封装了一个 fd,可以当文件流使用

可以通过 seekg() 将指针移至末尾,再使用 tellg() 获取文件的 size

TFile decryptAttchment;
decryptAttchment.seekg(0, seek_end);
int nFileSize = decryptAttchment.tellg();

查找串是否出现在列表,需要用 set 实现而不是 string.find

开发一个需求,需要在一个 rcpt list 中查找是否出现指定的 strRcpt

由于从 header 中解析出来的 list 是一个 string 的形式(abc@q.cn, cde@q.cn),直接使用 string.find(strRcpt) 来确定是否有相同的 rcpt;

这里犯了一个错误,子串的匹配可能会出现某个 rcpt 的部分匹配,导致结果认为当前 rcpt 在 list 中

strRcptLst = "abc@q.cn, cde@q.cn";
strRcpt = "bc@q.cn"
strRcptLst.find(strRcpt) // 这里将匹配到 abc@q.cn 的部分

所以当需要查找元素是否在集合中还是要使用 set 来处理

 

Valgrind

关于内存泄漏测试的一些异常

Syscall param write(buf) points to uninitialised byte(s)

Valgrind yells about an uninitialised bytes

Warning: set address range perms: large range

What Does This Valgrind Warning Mean? - warning set address range perms

Address 0xc5927f7 is 0 bytes after a block of size 21,463 alloc'd

valgrind - address is 8 bytes before a block of size 16 alloc'd

最新文章

  1. js精简写倒计时函数
  2. java设计模式--策略模式
  3. osharp3 整合 dbcontextscope 文章2 将dbcontext的创建收回到ioc管理
  4. Eclipse 最全快捷键
  5. hibernate 一对一关联关系 及其懒加载,总结
  6. codeforces 709A A. Juicer(水题)
  7. [转载]java NIO详解
  8. 在Mac中如何显示和隐藏文件
  9. Load Balancing 折半枚举大法好啊
  10. URAL 2065 Different Sums (找规律)
  11. RPGJS 进阶分析之 如何使用RMXP导出的数据
  12. JQuery重要知识点
  13. Oracle——PL/SQL 语句
  14. 工作经常使用的SQL整理,实战篇(一)
  15. BIEE基本函数
  16. win8.1远程连接Redis数据库
  17. [知了堂学习笔记]_用JS制作《飞机大作战》游戏_第2讲(四大界面之间的跳转与玩家飞机的移动)
  18. OpenCV角点检测goodFeaturesToTrack()源代码分析
  19. 关机充电如何实现短按pwrkey灭屏
  20. bzoj4035 [HAOI2015]数组游戏

热门文章

  1. unity热更新AssetBundle框架设计_框架篇
  2. springboot整合vue实现上传下载文件
  3. JVM 线程上下文类加载器
  4. PHP 范围解析操作符 (::) 主要用于访问静态成员和类常量
  5. vmware配置双网卡
  6. Eclipse SDK目录
  7. ES6深入浅出-10 ES6新增的数据类型-1.Symbol与隐藏属性
  8. Linux记录-shell自动化批量部署sql脚本并记录日志信息(转载)
  9. didMoveToSuperview方法认识和使用
  10. JavaScript图形实例:图形的旋转变换