`
mmdev
  • 浏览: 13028713 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

Cstring使用问题和struct结构体初始化方法汇总

 
阅读更多

今天在写程序为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 初始化 和 函数用法大全.pdf

    CString 初始化 和 函数用法大全,各种常见CString用法

    CString

    CString 类还使用了写入复制技术(CopyBeforeWrite),当使用一个 CString 对象 a 来初始化另一个 CString 对象 b 时,新对象 b 并不分配空间,它所要做的只是将自己的指针指向对象 a 的那块内存空间,只有当需要...

    Cstring 常用方法

    // 使用字符和次数初始化 CString s6((LPCSTR)ID_FILE_NEW); // 使用资源字符串初始化 ``` 六、Delete 方法 Delete 方法用于删除 CString 对象中的某个子串。该方法的声明为: int Delete(int nIndex, int nCount...

    QT中使用MFC的例子 可使用CString、MessageBox等MFC类和方法

    一个QT使用MFC的例子,示例为QT工程,其中引入MFC库,使用CString类,MessageBox方法进行了验证。示例工程为QT4+VS2013。此方式在QT3,QT4,QT5和VC6,VS2013,VS2015,VS2018中亦可使用。

    CString操作大全指南

    CString 转化成 char* 之二:使用String对象的GetBuffer方法;CString 转化成 char*之三;和控件的接口;CString 型转化成 BSTR 型;BSTR 型转化成 CString 型;VARIANT 型转化成 CString 型;载入字符串表资源;...

    成员初始化列表与构造函数体中的区别详细解析

    论坛中回答一个别人问题 C++ Primer中在讲构造函数初始化列表的时候有这么一段话:无论是在构造函数初始...其他类型成员的初始化和赋值有区别吗?==================================================================

    Cstring成员函数详解

    // 使用单个字符和重复次数初始化 CString s7((LPCSTR)ID_FILE_NEW); // 使用资源字符串初始化 Compare 函数 CString 类提供了多个 Compare 函数,用于比较 CString 对象与其他字符串。这些函数包括: * int ...

    CString使用方法~

    从网上找到的一些cstring的用法!!粘贴成了txt

    CString.Format格式化输出

    CString.Format格式化输出 CString.Format格式化输出是C#语言中的一种常用的字符串格式化输出方式。它可以将数值、日期、时间等信息按照指定的格式进行输出,常用于报表、日志、数据导出等场景。 CString.Format...

    CString和string对象

    CString和string对象的相互转化问题 CString对象和string对象是两种不同的字符串类型,它们之间的转化是非常重要的。本文将详细介绍CString和string之间的转化问题,以及它们的用法。 一、CString和string之间的...

    Cstring和日期之间的转换

    原创程序,其中写的是CString 和时间SYSTIME结构体之间的转换

    CString详细操作指南

    使用 CString 对象的 `Format()` 方法可以格式化一个字符串,例如: ``` CString s; s.Format(_T("The total is %d"), total); ``` 使用这种方法可以避免担心缓冲区是否足够大,CString 类会自动处理这些问题。 ...

    Cstring的使用大全

    Cstring的使用大全,很详细,介绍Cstring的各种使用方法

    string、cstring 、char* 转化问题

    本文将详细介绍 string、CString 和 char* 之间的转化问题,并提供了-six种不同的转化方法。 首先,让我们了解一下这三种类型的特点。CString 是基于 MFC 的一种字符串类型,安全性最高,但可移植性最差。string 是...

    CString使用

    主要方便MFC编程人员,快速使用CString类来做开发使用

    CString工作原理和常见问题分析

    介绍VC中CString对象的工作原理和一些容易犯得错误

    MFC中CString的使用介绍

    CString 的 Format 方法给我们进行字符串的转换带来了很大的方便,比如常见的 int、float 和 double 这些数字类型转换为 CString 字符串只需一行代码就可以实现。 1. int 转换为 CString: CString str; int ...

    CString类的使用

    CString类的函数及具体使用,String类作为MFC的常用类,当之无愧。可以这样说,只要是从事MFC开发,基本都会遇到使用CString类的场合。因为字符串的使用比较普遍,而CString类又提供了对字符串的便捷操作,所以它给...

    将CString字符串(包含中文,字母,数字等)保存到指定路径txt文件

    在上面的代码中,我们首先定义了一个CString字符串data,然后使用Replace方法将字符串中的回车换行符替换为window使用的回车换行符。接下来,我们定义了生成txt文件的路径,并使用CFile类打开该文件。然后,我们使用...

    CString函数大全.docx

    CString 是 MFC 中的一个字符串类,提供了多种构造函数和成员函数来操作字符串。下面是 CString 的一些常用构造函数和成员函数。 构造函数 CString 的构造函数有多种重载形式,分别是: * CString():默认构造...

Global site tag (gtag.js) - Google Analytics