string tName="";//试试(老师结构体中)
这个警告是在编译程序时出现的,意思是结构体Student中的score成员变量没有被初始化,而是采用了默认值。为了避免这个警告,应该在定义结构体时为所有成员变量提供初始值,或者在分配空间时初始化。
例如,可以将结构体Student的定义修改为:
Copy
struct Student {
string sName = "";
int score = 0;
};
这样,结构体中的所有成员变量都会被初始化。另外,在分配空间时也可以对结构体进行初始化:
ini
Copy
void allocateSpace(struct Teacher tArray[], int len) {
string nameSeed = "ABCDE";
for (int i = 0; i < len; i++) {
tArray[i].tName = "Teacher_";
tArray[i].tName += nameSeed[i];
for (int j = 0; j < 5; j++) {
tArray[i].sArray[j].sName = "Student_";
tArray[i].sArray[j].sName += nameSeed[j];
tArray[i].sArray[j].score = 60;
}
}
}
这样,在分配空间时就可以初始化结构体中的所有成员变量,避免了警告的出现。同时,为了避免命名空间std和string的混淆,可以将它们的声明顺序倒过来,先声明string再声明std:
Copy
#include <string>
namespace std {
// ...
}
这样可以确保命名空间std中的所有定义都能够正确引用string类型。完整的代码如下所示:
ini
Copy
#include <iostream>
#include <string>
using namespace std;
// 学生结构体
struct Student {
string sName = "";
int score = 0;
};
// 老师结构体定义
struct Teacher {
string tName = "";
Student sArray[5];
};
// 分配空间并初始化老师和学生的信息
void allocateSpace(Teacher tArray[], int len) {
string nameSeed = "ABCDE";
for (int i = 0; i < len; i++) {
tArray[i].tName = "Teacher_";
tArray[i].tName += nameSeed[i];
for (int j = 0; j < 5; j++) {
tArray[i].sArray[j].sName = "Student_";
tArray[i].sArray[j].sore = 60;
}
}
}
// 打印老师和学生的信息
void printInfo(Teacher tArray[], int len) {
for (int i = 0; i < len; i++) {
cout << "老师姓名:" << tArray[i].tName << endl;
for (int j = 0; j < 5; j++) {
cout << "学生姓名:" << tArray[i].sArray[j].sName
<< ",考试分数:" << tArray[i].sArray[j].score << endl;
}
}
}
int main() {
Teacher tArray[3];
int len = sizeof(tArray) / sizeof(tArray[0]);
allocateSpace(tArray, len);
printInfo(tArray, len);
system("pause");
return 0;
}
这样,就可以编译并运行这个程序了。在分配空间时,结构体中的所有成员变量都被正确初始化,程序不会再出现警告。同时,为了避免命名空间和string的混淆,我们还重新排列了它们的声明顺序。