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

时间:2013-03-04 01:34:07

标签: c++ constructor

我知道有很多关于这方面的问题,但我没有得到它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<<"\n\n";
    t.Set();
    cout<<"Aqui estan los nuevos valores: ";
    t.Show();
    cout<<"\n\n";
    cout<<"Lo corremos por 10 segundos...\n";
    for (int i=0;i<=10;i++)  {
        t.Increment();
        t.Show();
        cout<<'\n';    }
}

1 个答案:

答案 0 :(得分:4)

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

解决方案:显式为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.