灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:6006回复:0

[C++技术]Cstring使用问题和struct结构体初始化方法汇总

楼主#
更多 发布于:2012-11-10 14:15

今天在写程序为cstringarray变量操作时遇见:
ASSERT_VALID fails with illegal vtable pointer.
Assertion Failed: <unknown application>: File array_s.cpp, Line 236
这两个问题,几经查找、询问才知道是定义的结构体中的cstringarray虚拟表出错。
仔细看程序时才发现,我申请的结构体的指针,用memest初始化了,原来结构体没加cstringarray变量,全是char类型,所以用memset初始化。www.atcpu.com
cstringarray变量是不能用memset初始化的!!(至于为何还不很清楚......)
不用memset初始化,那我的结构体怎么初始化呢?
google一下发现有一下3种方法可以完成初始化:
1、结构体的构造函数中初始化
在C++中,结构体与类在使用上已没有本质上的区别了,所以可以使用构造函数来初始化。
如下代码所示:
 struct Stu
{
 int  nNum;
 bool bSex;
 char szName[20];
 char szEmail[100];
 //构造函数初始化
 Stu()
 {
  nNum = 0;
  bSex = false;
  memset(szName,0,sizeof(szName));
  memset(szEmail,0,sizeof(szEmail));
 }
};
你可能已经发现了,如果结构体中有大量成员,一个个赋值,相当麻烦。那么你可以这样写:
struct Stu
{
 int  nNum;
 bool bSex;
 char szName[20];
 char szEmail[100];
 //构造函数初始化
 Stu()
 {
   memset(this,0,sizeof(Stu));
   //或者是下面的格式
   //memset(;nNum,0,sizeof(Stu));
 }
};
如果在结构体中分配了指针,并且指针指向一个堆内存,那么就在析构函数中释放。以上便是在构造函数中初始化。
2、继承模板类初始化
首先定义一个模板基类:
template <typename T>
class ZeroStruct
{
public:
   ZeroStruct()
   {
       memset(this,0,sizeof(T));
   }
};
之后定义的结构体都继承于此模板类。
   struct Stu:ZeroStruct<Stu>
   {
       int        nNum;
       bool    bSex;
       char    szName[20];
       char    szEmail[100];
   };
这样也能实现初始化。
3、定义时初始化
   struct Stu
   {
       int     nNum;
       bool    bSex;
       char    szName[20];
       char    szEmail[100];
   };
//定义时初始化
Stu stu1 = {0};
在有的结构体中,第一个成员表示结构体的大小,那么就可以这样初始化:
struct Stu
{
 int nSize; //结构体大小
 int  nNum;
 bool bSex;
 char szName[20];
 char szEmail[100];
};
Stu stu1 = {sizeof(Stu),0};
后面的0,可以省略掉,直接写成:Stu stu1 = {sizeof(Stu)};后面自动会用0填充。
总结分析:
前面两种,实际上已经把结构体给类化了,和类的使用差不多。第三种,是纯粹的结构体的写法。
如果用途仅仅限定为结构体,我建议不要加上构造函数,也不要继承于那个模板类,因为这个时候结构体实际上已经是类了。在定义结构体时,将无法使用第三种方式去初始化,当然,此时也不需要初始化了。

喜欢0 评分0
游客

返回顶部