为什么我会收到错误 "use of deleted function 'class : : class()"

Why do I get the error "use of deleted function 'class : : class()"

#include <iostream>
using namespace std;

class student
{
protected:
    string name;
    int roll;
    int age;
public:
    student(string n, int r, int a)
    {
        name = n;
        roll = r;
        age = a;
    }
};

class test : public student
{
protected:
    int sub[5];
public:
    void marks()
    {
        cout << "Enter marks in 5 subjects: " << endl;
        cin >> sub[0] >> sub[1] >> sub[2] >> sub[3] >> sub[4];
    }
    void display()
    {
        cout << "Name : " << name << "\nRoll number : " << roll << "\nAge: " << age << endl;
        cout << "Marks in 5 subjects : " << sub[0] << ", " << sub[1] << ", " << sub[2] << ", " << sub[3] << ", " << sub[4] << endl;
    }
};

class sports
{
protected:
    int sportmarks;
public:
    sports(int sm)
    {
        sportmarks = sm;
    }
};

class result : public test, public sports
{
    int tot;
    float perc;
public:
    void calc()
    {
        tot = sportmarks;
        for(int i = 0; i < 5; i++)
            tot = tot + sub[i];
        perc = (tot / 600.0) * 100;
        cout << "Total: " << tot << "\nPercentage: " << perc << endl;
    }
};

int main()
{
    student ob1("Name", 781, 19);
    sports ob2(78);
    result ob;
    ob.marks();
    ob.display();
    ob.calc();
}

我被要求使用参数化构造函数来解决这个问题,并注意到我在使用构造函数时遇到了这些错误。如果此 post 不便阅读,请见谅。在从参数化构造函数创建对象时,我可以用什么方式 运行 这段代码?

use of deleted function 'result::result()'
use of deleted function 'test::test()'.
no matching function for call to 'student::student()'
no matching function for call to 'sports::sports()'

studentsports 具有用户定义的构造函数,因此编译器不会为它们生成默认构造函数。

testresult没有用户定义的构造函数,所以编译器会为它们生成默认的构造函数。但是,由于 studentsports 没有默认构造函数,因此生成的默认构造函数被标记为 delete,因为它们不可用。这就是你出错的原因。

为了让你的main()按原样编译,你需要为testresult定义你自己的默认构造函数,它们将显式参数值传递给它们的基classes,例如:

#include <iostream>
using namespace std;

class student
{
protected:
    string name;
    int roll;
    int age;
public:
    student(string n, int r, int a)
    {
        name = n;
        roll = r;
        age = a;
    }
};

class test : public student
{
protected:
    int sub[5];
public:
    test() : student("", 0, 0) {}

    void marks()
    {
        cout << "Enter marks in 5 subjects: " << endl;
        cin >> sub[0] >> sub[1] >> sub[2] >> sub[3] >> sub[4];
    }

    void display()
    {
        cout << "Name : " << name << "\nRoll number : " << roll << "\nAge: " << age << endl;
        cout << "Marks in 5 subjects : " << sub[0] << ", " << sub[1] << ", " << sub[2] << ", " << sub[3] << ", " << sub[4] << endl;
    }
};

class sports
{
protected:
    int sportmarks;
public:
    sports(int sm)
    {
        sportmarks = sm;
    }
};

class result : public test, public sports
{
    int tot;
    float perc;
public:
    result() : test(), sports(0) {}

    void calc()
    {
        tot = sportmarks;
        for(int i = 0; i < 5; i++)
            tot = tot + sub[i];
        perc = (tot / 600.0) * 100;
        cout << "Total: " << tot << "\nPercentage: " << perc << endl;
    }
};

int main()
{
    student ob1("Name", 781, 19);
    sports ob2(78);
    result ob;
    ob.marks();
    ob.display();
    ob.calc();
}

Online Demo

然而,这不是很有用,所以我建议调整 result 的构造函数以获取您事先创建的 studentsports 对象,并传递它们基本 class 复制构造函数,编译器将为您生成,例如:

#include <iostream>
using namespace std;

class student
{
protected:
    string name;
    int roll;
    int age;
public:
    student(string n, int r, int a)
    {
        name = n;
        roll = r;
        age = a;
    }
};

class test : public student
{
protected:
    int sub[5];
public:
    test(const student &s) : student(s) {}

    void marks()
    {
        cout << "Enter marks in 5 subjects: " << endl;
        cin >> sub[0] >> sub[1] >> sub[2] >> sub[3] >> sub[4];
    }

    void display()
    {
        cout << "Name : " << name << "\nRoll number : " << roll << "\nAge: " << age << endl;
        cout << "Marks in 5 subjects : " << sub[0] << ", " << sub[1] << ", " << sub[2] << ", " << sub[3] << ", " << sub[4] << endl;
    }
};

class sports
{
protected:
    int sportmarks;
public:
    sports(int sm)
    {
        sportmarks = sm;
    }
};

class result : public test, public sports
{
    int tot;
    float perc;
public:
    result(const student &s, const sports &sp) : test(s), sports(sp) {}

    void calc()
    {
        tot = sportmarks;
        for(int i = 0; i < 5; i++)
            tot = tot + sub[i];
        perc = (tot / 600.0) * 100;
        cout << "Total: " << tot << "\nPercentage: " << perc << endl;
    }
};

int main()
{
    student ob1("Name", 781, 19);
    sports ob2(78);
    result ob(ob1, ob2);
    ob.marks();
    ob.display();
    ob.calc();
}

Online Demo