class Lesson
{
public:
string subject,ID;
int credit;
char grade;
Lesson(string sub,string id,int cre,char gra):subject(sub),ID(id),credit(cre),grade(gra){}
void display2()
{
cout<<ID<<" "<<subject<<" "<<credit<<" "<<grade<<" "<<endl;
}
};
class Student
{
public:
Lesson le[6] //在这里定义的对象数组
string name;
int ID,number;
char yn;
Student(string nam,int id,int num,char YN):name(nam),ID(id),number(num),yn(YN){} //**
...................
(这个类后面还有函数什么的)
然后我在main函数中先将Student的构造函数初始化,再将数组初始化,如下
Student stud1("Lisa Miller",890238,4,'Y'),stud2("Bill Wilton",798324,5,'N'),stud3("Dandy Goat",746333,6,'Y');
stud1.le[4]={
Lesson("ComputerSci","CSC478",3,'B'),
Lesson("History","HIS356",3,'A'),
Lesson("Mathematics","MTH345",4,'A'),
Lesson("Physics","PHY357",3,'B')
};
但是编译器说是//**这一条语句出错 原因是没有默认构造函数
还有对数组初始化的{}括号也说是错误
求解
int b[3];
b[3] = {1, 2, 3}; // error of course
C++ 中, 不能用第二种方式 对数组 初始化, 除非 像a一样, 在定义的时候 可以.
=====
多说一些:
如果 Lesson 没有默认的构造函数, 那么在Stu 类中 又没有显式的调用 Lesson 的 非默认构造函数的话, 会编译错误.
这点在 <Effictive C++> 上讲了. 因为, Lesson数组定义的时候, 是要为它的每一个元素 调用构造函数的. 而同时, <C++ Primer> 也讲了, 对于类中的成员, 如果不显式的对其初始化, 那它便会调用该成员的默认构造函数初始化.
所以对于 你的问题,
对 Lesson 添加 默认构造函数.
像这样 :
Student(string nam,int id,int num,char YN):name(nam),ID(id),number(num),yn(YN),
le{{"ss", "22", 3, 'c'}, {"hh", "11", 4, 'l'}, .....} // 对类中成员 为 数组的 初始化, 必须 在这里(构造函数的初始化列表中, 而不能在它的函数体中)
{ // 不能在这. }