C++错误c2512:没有默认的构造函数可用
我知道有很多这方面的问题,但我不明白D:对不起,我是新来的,还有一些东西, t理解......这是一个家庭作业,我需要为计时器设置一个闹钟,突然出现这个错误(当我在学校的电脑上工作时,这个错误不存在),我不知道如何解决它请帮助我! 这是我的代码:C++错误c2512:没有默认的构造函数可用
#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'; }
}
您的Timer类有显示对象的数据成员,和定时器的构造并没有明确构建所有的人(AlarmH,AlarmM,报警)。因此,编译器试图使用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.
谢谢!它清除了,虽然它没有完全修复它的Visual,现在它说: 错误LNK2019:无法解析的外部符号“公共:__thiscall显示器::显示器(void)”(?? 0Display @@ QAE @ XZ)引用在函数“public:__thiscall Timer :: Timer(void)”(?? 0Timer @@ QAE @ XZ) S: – Opponent019 2013-03-04 02:01:34
@Eirikra我的回答只有一个声明为Display()。我已经编辑它来向你展示如何提供定义。 – JBentley 2013-03-04 02:10:17
ooooooh,哈哈不知道我也必须这样做,谢谢! :) – Opponent019 2013-03-04 03:34:19
你的错误不可能是再清楚不过考虑到它应该指向你的错误行。 – Rapptz 2013-03-04 01:35:15
提示:您拥有“Display”类的成员,但“Display”缺少默认构造函数。 – Rapptz 2013-03-04 01:36:24
是的,它的确如此,但这没有任何意义......它指向第61行,即: Timer :: Timer():小时(24),分钟(60)秒(60) } 但是错误显示Display没有默认的构造函数... – Opponent019 2013-03-04 01:37:15