C++使用时的常见问题汇总

2012年04月16日

写在前面


记录使用C++时的一些常见问题,难调Bug及相应解决方法。

Link2005 Error的重复定义问题


经过

#ifndef HANDLE_H 
#define HANDLE_H
..........
#endif

处理后只能减少重复编译,只解决重复包涵问题,不能解决重复定义问题。

如果大家遇到C++ link2005 error重复定义问题,很明显是链接错误,很有可能是你在头文件中有类外函数的实现或者静态数据的定义。

这个可以这么理解:定义和可以分为两种:类型定义,数据定义。类型定义不分配内存,比如类的定义,结构体的定义,即使数据类型的定义;数据定义分配内存,比如类对象定义,变量定义。函数声明可以看做类型定义,函数实现合一看做数据定义。不分配内存的放在头文件,分配内存的放在cpp,防止重复定义。

CString转换成const char*


在Visual Studio 20XX下,CString直接转换成const char*有点困难。下面是自己用的一种可行方案,这个实例是取得CString类型的图像路径后,将CString转换为char*并使用cvLoadImage读取图像。

//得到目录路径
CString mPath=dlg.GetPathName();

//将目录路径转换成绝对路径以便cvLoadImage调用
int m=mPath.GetLength();
for(int index=0;index<m;index++)
{
   if(mPath.GetAt(index)=='\\')
    {
    mPath.Insert(index,'\\');
    index++;
    }
}

//将CString转换成LPCTSTR
LPCTSTR p=mPath.GetBuffer();

/*
将LPCTSTR转换为const char *,因为Unicode的问题,LPCTSTR在非UNICODE环境下为 const char * ,在UNICODE环境下为 const unsigned short *

在情况2时需要借助API函数WideCharToMultiByte

int WideCharToMultiByte(  
  UINT CodePage,            // code page  
  DWORD dwFlags,            // performance and mapping flags  
  LPCWSTR lpWideCharStr,    // wide-character string  
  int cchWideChar,          // number of chars in string  
  LPSTR lpMultiByteStr,     // buffer for new string  
  int cbMultiByte,          // size of buffer  
  LPCSTR lpDefaultChar,     // default for unmappable chars  
  LPBOOL lpUsedDefaultChar  // set when default char used  
);  
*/

DWORD dwMinSize;
dwMinSize=WideCharToMultiByte(CP_ACP,NULL,p,-1,NULL,0,NULL,FALSE);
char * pp=new char[dwMinSize];
WideCharToMultiByte(CP_OEMCP,NULL,p,-1,pp,dwMinSize,NULL,FALSE);

//读取图像
IplImage* ip1=cvLoadImage(pp,-1);

数组引用


类型名 (&变量名)[N]就可以得到一个数组的引用,例:

int array[10];
int (&ref)[10]=array;

在函数传参时,要想进行数组引用,必须指明数组的大小,如:

char a[3]={'a','b','c'};
void fun(char (&buf)[3])
{
  buf[0]='d';
}
cout<<a[0]<<endl;

如果想接受任意长度的数组,使用函数模板:

template<size_t size>
void fun(char (&buff)[size])
{
  buf[0]=='d';
}

小注


将持续更新。


版权声明:本文为博主原创文章,转载请注明出处 本文总阅读量    次