c++错误c2512:没有可用的默认构造函数

C++ Error c2512: No default constructor avaliable

本文关键字:默认 构造函数 错误 c2512 c++      更新时间:2023-10-16

我知道关于这个有很多问题,但是我不明白D:对不起,我是新手,有些东西我还是不明白…这是一个作业,我需要为计时器设置一个闹钟,突然出现了这个错误(我在学校的电脑上工作时没有这个错误),我不知道如何修复,所以请帮助我!这是我的代码:

#include "stdafx.h"
#include <iostream>
using namespace std;
class Display {
public:
    Display(int lim);
    void Increment();
    void SetValue(int val);
    int GetValue();
    void Show();
    int GetLimit();
private:
    int limit, value;
};
class Timer {
public:
    Timer();
    void Increment();
    void Set();
    void SetAlarm();
    void Show();
    void ShowAlarm();
private:
    Display hours, minutes, seconds, alarmH, alarmM, alarmS;
};
Display::Display(int lim)  {
    value=0;
    limit=lim;    }
void Display::Increment()  {
    value++;
    if (value==limit)
        value=0;   }
void Display::SetValue(int val)   {
    if (val<0)
        val=-val;
    value=(val%limit);   }
int Display::GetValue()  {
    return value;   }
void Display::Show()  {
    if (value<10)
        cout<<"0";
    cout<<value;  }
int Display::GetLimit() {
    return limit;  }
Timer::Timer():hours(24), minutes(60), seconds(60) {
}
void Timer::Increment()  {
    seconds.Increment();
    if(seconds.GetValue()==0) {
        minutes.Increment();
        if(minutes.GetValue()==0)
            hours.Increment();} }
void Timer::Show()  {
    hours.Show();
    cout<<':';
    minutes.Show();
    cout<<':';
    seconds.Show();  }
void Timer::ShowAlarm()  {
    alarmH.Show();
    cout<<':';
    alarmM.Show();
    cout<<':';
    alarmS.Show();  }
void Timer::Set()  {
    int setting;
    cout<<"Poner horas a que valor?n";
    cout<<"Ingresa un entero entre 0 y "; cout<<hours.GetLimit()<<": ";
    cin>>setting;
    hours.SetValue(setting);
    cout<<"Poner minutos a que valor?n";
    cout<<"Ingresa un entero entre 0 y "; cout<<minutes.GetLimit()<<": ";
    cin>>setting;
    minutes.SetValue(setting);
    cout<<"Poner segundos a que valor?n";
    cout<<"Ingresa un entero entre 0 y "; cout<<seconds.GetLimit()<<": ";
    cin>>setting;
    seconds.SetValue(setting);    }
void Timer::SetAlarm()  {
    int setting;
    cout<<"Poner horas a que valor?n";
    cout<<"Ingresa un entero entre 0 y "; cout<<hours.GetLimit()<<": ";
    cin>>setting;
    alarmH.SetValue(setting);
    cout<<"Poner minutos a que valor?n";
    cout<<"Ingresa un entero entre 0 y "; cout<<minutes.GetLimit()<<": ";
    cin>>setting;
    alarmM.SetValue(setting);
    cout<<"Poner segundos a que valor?n";
    cout<<"Ingresa un entero entre 0 y "; cout<<seconds.GetLimit()<<": ";
    cin>>setting;
    alarmS.SetValue(setting); }
void main()  {
    Timer t;
    cout<<"Aqui esta el valor incial del timer: ";
    t.Show();
    cout<<"nn";
    t.Set();
    cout<<"Aqui estan los nuevos valores: ";
    t.Show();
    cout<<"nn";
    cout<<"Lo corremos por 10 segundos...n";
    for (int i=0;i<=10;i++)  {
        t.Increment();
        t.Show();
        cout<<'n';    }
}

您的Timer类有显示对象作为数据成员,并且Timer的构造函数没有显式地构造所有这些对象(AlarmH, alarmmm, AlarmS)。因此,编译器尝试使用Display的默认构造函数来构造它们,但是没有。这是因为您已经为Display提供了一个(非默认的)构造函数,所以编译器不会自动为您生成一个默认构造函数(如果您没有为Display提供任何构造函数,它会自动生成)。

解决方案:显式地为Display提供自己的默认构造函数。

声明:

class Display {
public:
    Display(); // Default constructor
    Display(int lim);
    void Increment();
    void SetValue(int val);
    int GetValue();
    void Show();
    int GetLimit();
private:
    int limit, value;
};

定义:

Display::Display(){} // Default constructor
Display::Display(int lim)  {
    value=0;
    limit=lim;    }
// etc.