问题:
1.typedef的意义?struct后紧跟着的名称的意义?struct括号末尾后名称的意义?
2.如何在结构体内调用自己?
3.如何在别的结构体中调用已经定义了的结构体?在结构体中定义结构体数组,申请内存应当如何申请内存?
4.在别的文件中定义的结构体是否能被另外文件中的结构体调用?
问题解决:
1.typedef的调用方式为:
typedef Name1 Name2;
Name1 与 Name2 具有相同的意义;
Name1* object = (Name1*)(malloc(sizeof(Name1)));
Name2* object = (Name2*)(malloc(sizeof(Name2)));
上述两者意义相同;
所以:
typedef struct Name1
{
int A;
long Timer;
}Name2;
Name1* object = (Name1*)(malloc(sizeof(Name1)));
Name2* object = (Name2*)(malloc(sizeof(Name2)));
上述是将struct Name1 替换为了Name2;
所以下面赋值依然合法;
所以:struct后紧跟着的名称的意义与struct括号末尾后名称的意义相同。
2.malloc函数是返回(void*)类型的内存给指针。只能分配内存给指针而不能给常量。
所以如果想要自己调用自己,就只能定义自己的指针。(比如链表)
struct Name1
{
int Data;
static int A;
Name1* object; // 自己调用自己
};
3.malloc只能分配内存给隶属于此结构体的结构。
typedef struct Role_Struct
{
int Map_x,Map_y;
struct
{
int x,y;
int w,h;
}CollisionBody;
}Role_Struct;
上述的结构体的结构全是隶属于此结构体结构,malloc能直接分配内存给对象。
typedef struct MonsterAttackRole_Struct
{
int SkillNum;
int SkillHurm;
}MonsterAttackRole_Struct;
typedef struct Role_Struct
{
int Map_x,Map_y;
MonsterAttackRole_Struct* RoleAttackedByMonster[100];
}Role_Struct;
上述中,在另一个类中出现另一个结构体变量,另一个结构体变量不属于此结构体,malloc函数无法为其对象分配内存,需要单独进行分配。
Role_Struct* Role_object = (Role_Struct*)(malloc(sizeof(Role_Struct)));
//首先为第一个对象分配内存
for(int Num = 0;Num <= 100 - 1; Num++)
{
Role_object->RoleAttackedByMonster[Num] = (MonsterAttackRole_Struct*)
malloc(sizeof(MonsterAttackRole_Struct));
}
//为人物对象中的每一个其他类对象分配内存
应该采用上述操作进行内存分配。
4.在别的文件中定义的结构体只能被另外的.cpp文件中的结构体调用,而不能被其他的.h文件调用。
struct Exp_Struct
{
int A;
long B;
};
//-------------------Exp1.h---------------------
typedef struct Exp2_Struct
{
int A;
long B;
Exp_Struct* Exp2_object;
}Exp2_Struct;
//-------------------Exp2.h---------------------
上述写法为错误写法:
原因:编译器总是先编译.h文件再去编译.cpp文件。
在一起编译.h文件的时候Exp2.h中会发生Exp_Struct未定义的情况。
struct Exp_Struct
{
int A;
long B;
};
//-------------------Exp1.h---------------------
typedef struct Exp2_Struct
{
int A;
long B;
Exp_Struct* Exp2_object;
}Exp2_Struct;
//-------------------Exp2.cpp---------------------
上述写法正确:
因为.h文件全部编译完成之后,再去编译.cpp文件就不会出错。
综上:结构体能跨文件在别的.cpp中定义调用。
解决办法:
struct Exp2_Struct;
//在使用之前提前声明就不会出问题。
struct Exp_Struct
{
int A;
long B;
Exp2_Struct* Exp2_object;
};
//-------------------Exp1.h---------------------
struct Exp_Struct;
//在使用之前提前声明就不会出问题。
typedef struct Exp2_Struct
{
int A;
long B;
Exp_Struct* Exp2_object;
}Exp2_Struct;
//-------------------Exp2.h---------------------
如上图:只要在对应的文件中提前声明要使用的结构体,就能相互调用。A中调用B,B中调用A,形成环链表。