C++:从另一个 class 中的 class 调用构造函数
C++ : Calling a constructor from a class inside another class
我正在编写包含三个 classes 的代码:日期、笔记和学生。
日期由:int, int, int
注释由:string, double, int
在ex3.h中:
class student;
class date {
private:
//---------declaration of attributes-----
int j ; // day
int m ; // month
int a ; //year
// --------------
public:
date( int , int , int ) ;
date( const date & );
friend class student;
};
class note {
private:
//---------declaration of attributes-----
string matiere ;
double n ; // grade
int coef ; //coefficient
// --------------
public:
note( string , double , int ) ;
friend class student;
};
note::note(string mat , double no, int c ){matiere=mat;n=no;coef=c;}
date::date(int a1 , int b , int c){j=a1;m=b;a=c;}
日期和注释没问题。
我希望学生由以下内容组成:string、string、date、note、note、note
这是我写的:
class student{
private:
//---------declaration of attributes-----
string nom ; // surname
string prenom ; // first name
date ddn ; //date of birth
note n1;
note n2;
note n3;
double mean;
// --------------
public:
student( string , string, date, note , note, note ) ;
student::student(string nomi, string prenomi, date di, note nte1, note nte2, note nte3 ){
nom=nomi;prenom=prenomi;ddn=di;n1=nte1;n2=nte2;n3=nte3;}
我尝试在 ex3.cpp 中创建一个学生:
date d1(12,10,2000);
note nt1("Math",20,2);
note nt2("Math",20,2);
note nt3("English",19.5,3);
student e1("Appleseed","Johnny",d1,nt1,nt2,nt3);
最后一行出现以下错误:
“错误:没有匹配函数来调用 'date::date()' “
“错误:调用 'note::note()' 时没有匹配的函数”(两次,因为注释在函数中出现了两次)
我已经尝试更改最后一行的参数,即构造函数的参数...我不知道如何让学生 class 发挥作用。
谁能帮帮我?
谢谢!
我复制了一些代码,希望没有遗漏任何内容。
原代码不是英文,我尽量翻译了。
PS:我是堆栈溢出的新手,所以请耐心等待我问第一个问题^^'
当您创建一个 student
类型的对象时,它的成员是在 student
的构造函数开始执行之前使用默认构造函数创建的。因此,编译器尝试调用 date
类型对象的默认构造函数,然后在 studen
t 的构造函数的主体中调用复制赋值。同样的问题适用于 note
对象。通过定义自定义构造函数,您删除了那些 classes.
的默认构造函数
解决方法是使用初始化列表。下面的代码可以解决您的问题。
student::student(string nomi, string prenomi, date di, note nte1, note nte2, note nte3)
: ddn(di), n1(nte1), n2(nte2), n3(nte3)
{
nom = nomi;
prenom = prenomi;
}
您还可以通过在每个 class.
中键入以下内容来明确说明您需要默认构造函数
class date {
public:
date() = default;
/** ... **/
};
class note {
public:
note() = default;
/** ... **/
};
顺便说一下,代码的缩进和组织方式很难阅读。我建议你干净利落地学习。
我正在编写包含三个 classes 的代码:日期、笔记和学生。
日期由:int, int, int
注释由:string, double, int
在ex3.h中:
class student;
class date {
private:
//---------declaration of attributes-----
int j ; // day
int m ; // month
int a ; //year
// --------------
public:
date( int , int , int ) ;
date( const date & );
friend class student;
};
class note {
private:
//---------declaration of attributes-----
string matiere ;
double n ; // grade
int coef ; //coefficient
// --------------
public:
note( string , double , int ) ;
friend class student;
};
note::note(string mat , double no, int c ){matiere=mat;n=no;coef=c;}
date::date(int a1 , int b , int c){j=a1;m=b;a=c;}
日期和注释没问题。
我希望学生由以下内容组成:string、string、date、note、note、note
这是我写的:
class student{
private:
//---------declaration of attributes-----
string nom ; // surname
string prenom ; // first name
date ddn ; //date of birth
note n1;
note n2;
note n3;
double mean;
// --------------
public:
student( string , string, date, note , note, note ) ;
student::student(string nomi, string prenomi, date di, note nte1, note nte2, note nte3 ){
nom=nomi;prenom=prenomi;ddn=di;n1=nte1;n2=nte2;n3=nte3;}
我尝试在 ex3.cpp 中创建一个学生:
date d1(12,10,2000);
note nt1("Math",20,2);
note nt2("Math",20,2);
note nt3("English",19.5,3);
student e1("Appleseed","Johnny",d1,nt1,nt2,nt3);
最后一行出现以下错误: “错误:没有匹配函数来调用 'date::date()' “
“错误:调用 'note::note()' 时没有匹配的函数”(两次,因为注释在函数中出现了两次)
我已经尝试更改最后一行的参数,即构造函数的参数...我不知道如何让学生 class 发挥作用。 谁能帮帮我?
谢谢!
我复制了一些代码,希望没有遗漏任何内容。
原代码不是英文,我尽量翻译了。
PS:我是堆栈溢出的新手,所以请耐心等待我问第一个问题^^'
当您创建一个 student
类型的对象时,它的成员是在 student
的构造函数开始执行之前使用默认构造函数创建的。因此,编译器尝试调用 date
类型对象的默认构造函数,然后在 studen
t 的构造函数的主体中调用复制赋值。同样的问题适用于 note
对象。通过定义自定义构造函数,您删除了那些 classes.
解决方法是使用初始化列表。下面的代码可以解决您的问题。
student::student(string nomi, string prenomi, date di, note nte1, note nte2, note nte3)
: ddn(di), n1(nte1), n2(nte2), n3(nte3)
{
nom = nomi;
prenom = prenomi;
}
您还可以通过在每个 class.
中键入以下内容来明确说明您需要默认构造函数class date {
public:
date() = default;
/** ... **/
};
class note {
public:
note() = default;
/** ... **/
};
顺便说一下,代码的缩进和组织方式很难阅读。我建议你干净利落地学习。