今天在写程序为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填充。
总结分析:
前面两种,实际上已经把结构体给类化了,和类的使用差不多。第三种,是纯粹的结构体的写法。
如果用途仅仅限定为结构体,我建议不要加上构造函数,也不要继承于那个模板类,因为这个时候结构体实际上已经是类了。在定义结构体时,将无法使用第三种方式去初始化,当然,此时也不需要初始化了。
分享到:
相关推荐
网络传输struct类型数据时,结构体不能包含可变大小的数据,如C++的CString或std::string。这意味着结构体内的成员只能是C++的基本数据类型(如int, char, bool等)或这些基本类型的固定大小数组。例如,以下是一个...
初始化发送方结构体 ... send(moSndSocket, (char*)&oScdData, sizeof(SecondData), 0); // ... 接收方处理 ... SecondData rcvData; recv(m_RcvSocket, rcvBuffer, sizeof(rcvBuffer), 0); memcpy(&rcvData, ...
当一个已存在的CString对象被用来初始化新的CString对象时,新对象并不会立即分配新的内存,而是直接引用原始对象的内存。只有在需要修改字符串内容时,新对象才会分配自己的内存空间。这种设计减少了不必要的内存...
系统提供了四个主要操作:初始化、插入、删除和修改,以满足不同场景的需求。 系统的核心功能是通过C++编程语言实现的,利用结构体(struct)来定义学生信息的数据结构。例如,`struct Student`包含了学生的学号...
包含了`<stdlib.h>`, `<string.h>`, 和 `<malloc.h>`头文件,这些是C库的函数,尽管在C++中,更推荐使用`<cstdlib>`, `<cstring>`, 和 `<new>`,但在这里它们仍然有效,用于提供一些基本的库函数,如内存分配和字符...
在结构体定义中,`struct rating`包含了排行榜信息,如玩家姓名和得分,`struct gameset`存储了游戏设置,如屏幕大小、方块样式等。`now[][]`数组用于存储当前方块的状态,`xnow`和`ynow`表示方块的位置,`guide`...
API _declspec(dllexport) <br>#else <br>#define DLL_API _declspec(dllimport) <br>#endif <br>//****************************** <br>//属性结构体 <br>typedef struct { <br> CString Name...
2.2本程序系统模块(1)主程序模块:main ( ) { 初始化; while(“命令”=“输入”){ 接受输入数据;处理数据; } while (“命令”=“浏览数据”) { 接受具体指令; 显示相应数据;[参考文献][1] 严蔚敏,...
AfxMessageBox("无法初始化Socket,请检查!"); return FALSE; } WSADATA wsaData; WORD wVersion = MAKEWORD(1, 1);//设定为Winsock 1.1版 int errCode; errCode = WSAStartup(wVersion, &wsaData)...
struct User //用户结构体类型定义 { char szName[20]; //用户名 int nTime; //使用次数 int nTest; //测试次数 double alAve; //平均成绩 int nAdd; //加法次数 int nSub; //减法次数 int nMul; //乘法次数 double ...
//餐桌信息初始化 int search(void);//查找匹配的餐桌 ORDER* Dish_Order(ORDER *,ORDER *);//将节点插入到主链 void Display(int);//显示菜的信息; void saveInList(float);//将客户消费额写入账单 void Save_...