今天在写程序为cstringarray变量操作时遇见:
ASSERT_VALIDfailswithillegalvtablepointer.
AssertionFailed:<unknownapplication>:Filearray_s.cpp,Line236
这两个问题,几经查找、询问才知道是定义的结构体中的cstringarray虚拟表出错。
仔细看程序时才发现,我申请的结构体的指针,用memest初始化了,原来结构体没加cstringarray变量,全是char类型,所以用memset初始化。
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填充。
总结分析:
前面两种,实际上已经把结构体给类化了,和类的使用差不多。第三种,是纯粹的结构体的写法。
如果用途仅仅限定为结构体,我建议不要加上构造函数,也不要继承于那个模板类,因为这个时候结构体实际上已经是类了。在定义结构体时,将无法使用第三种方式去初始化,当然,此时也不需要初始化了。
分享到:
相关推荐
CString 初始化 和 函数用法大全,各种常见CString用法
一个QT使用MFC的例子,示例为QT工程,其中引入MFC库,使用CString类,MessageBox方法进行了验证。示例工程为QT4+VS2013。此方式在QT3,QT4,QT5和VC6,VS2013,VS2015,VS2018中亦可使用。
CString 转化成 char* 之二:使用String对象的GetBuffer方法;CString 转化成 char*之三;和控件的接口;CString 型转化成 BSTR 型;BSTR 型转化成 CString 型;VARIANT 型转化成 CString 型;载入字符串表资源;...
论坛中回答一个别人问题 C++ Primer中在讲构造函数初始化列表的时候有这么一段话:无论是在构造函数初始...其他类型成员的初始化和赋值有区别吗?==================================================================
从网上找到的一些cstring的用法!!粘贴成了txt
原创程序,其中写的是CString 和时间SYSTIME结构体之间的转换
Cstring的使用大全,很详细,介绍Cstring的各种使用方法
主要方便MFC编程人员,快速使用CString类来做开发使用
C_String.Format格式化输出介绍
介绍VC中CString对象的工作原理和一些容易犯得错误
CString类的函数及具体使用,String类作为MFC的常用类,当之无愧。可以这样说,只要是从事MFC开发,基本都会遇到使用CString类的场合。因为字符串的使用比较普遍,而CString类又提供了对字符串的便捷操作,所以它给...
CString对象和string对象的相互转化问题,以及他们呢的用法
非常全面的cstring类使用介绍和实例
在VC++编程中,我们有时会遇到关于截取字符串的问题,对于CString类型字符串的截取VC中有现成的函数可供使用,主要是:CString Mid (int nFirst, int nCount);和BOOL AfxExtractSubString (CString& rString, ...
Int转化成Cstring CString cStr; int nCount=999; cStr.Format(_T("%d"),cCount); CSTRING如何转成INT 网上的介绍都是用atoi函数,但是CString 内部存储的是wchar_t 类型的字符,每个字符占两个字节,atoi的参数是char*...
CString与各种类型字符之间转换和方法使用,例如char型,指针等
CString转UTF8,UTF8转CString。
VC 使用StdString类代替CString类的方法和示例源码,支持ansi、unicode。实际在一些项目中用了一段,感觉非常棒,特此推荐给大家。
CString和string的不同在c++中的一部分的问题。
CString有关对象和引用知识 课件 课件