c++错误c2512:没有可用的默认构造函数
C++ Error c2512: No default constructor avaliable
我知道关于这个有很多问题,但是我不明白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.
相关文章:
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 初始化具有非默认构造函数的std::数组项的更好方法
- 具有默认模板类型的默认构造函数的类型推导
- 如何使用非默认构造函数实例化模板化类
- 有没有一种代码密度较低的方法来使用非默认构造函数初始化数组?
- 声明没有默认构造函数的字段
- 没有默认构造函数作为模板参数的自定义比较器
- C++17 没有默认构造函数的地图放置(私有默认构造函数)
- 使用移动调用对等构造函数unique_ptr默认构造函数
- C++复制构造函数和默认构造函数
- 将向量从 N1 缩小到 N2 项,而不触发默认构造函数并仅使用 move 语义
- 为什么即使我调用参数化构造函数也会调用默认构造函数?
- 具有非默认构造函数的单例类
- 在 C++ 中声明 const 对象需要用户定义的默认构造函数.如果我有一个可变成员变量,为什么不呢?
- 如何处理没有默认构造函数但在另一个构造函数中构造的对象?
- 在C++中使用默认构造函数初始化对象的不同方法
- 在没有默认构造函数的情况下创建的派生对象
- 强制使用默认构造函数对成员进行未初始化的声明
- 使用默认构造函数初始化对象的不同方法
- 创建类类型的动态分配数组,其中类不得具有默认构造函数