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 类型对象的默认构造函数,然后在 student 的构造函数的主体中调用复制赋值。同样的问题适用于 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;

    /** ... **/
};

顺便说一下,代码的缩进和组织方式很难阅读。我建议你干净利落地学习。