您的位置:首页 > 编程语言 > C语言/C++

c++ 自己遇到的编程陷阱或技巧

2014-04-30 22:24 260 查看

技巧

1.获得类中属性的引用 (比如kaldi中的matrix,重载了(),返回值是个引用,就可以实现 ()= 的效果了)
int &Cls::cite(){
return b; //b in Cls
}


2.define中#的作用,对宏参数进行字符化操作。及其他有用的宏命令
#define FUN(fun) \
cout<<#fun<<endl;
FUN(fun(123));  //会输出 fun(123)

#pragma message("this is message ")  //编译器输出打印信息,但是不退出。  可以用来检查头文件的调用
# error ("Error")   //直接退出


3.检测Nan,inf
检测nam用 a==a ,如果是a=nan,则上式不成立。
检测inf,如果有boost,则先引用头文件
#include </usr/include/boost/math/special_functions/fpclassify.hpp>

然后使用 isinf(a)

陷阱

1.map中最好放结构体的指针而不是结构体本身。自己做的 3D特效五子棋对战平台,当release的时候,存有结构体的map会报错。

猜测原因:在函数中生成结构体后,虽然装入到了map但是函数结束后会释放。 (不一定对,应为debug模式下没错)

2.map中边遍历,边删除一些key会报错。

自己用如下方式解决,(就是多设置了一个变量)

map <unsigned long long,pSamfmt>::iterator it_tp=it_fmt;
it_fmt++;
mp_fmt.erase(it_tp);
free(fmt);
3.使用strtok后会把原来字符串中指定的字符串变为0,所以最好用个副本。
pC=strtok(fmt->id,"_");
fmt->rd1=atoi(strtok(NULL,"_"));
fmt->rd2=atoi(strtok(NULL,"_"));


4.虚函数,应该只对使用指针时有用

void demo1(){//有效果
B *b=new B();
A * a=b;
a->f();
}
void demo2(){//加不加virtual都执行a中定义的函数
B b;
A a=(A)b;//或者A a=b;
a.f();
}

5. stringstream 清空的问题

目前为止感觉.clear()没用需要用.str("") ,如果要转为char则需要.str().c_str();

//未完待续……
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: