-1

これについて多くの質問があることは知っていますが、よくわかりません 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';    }
}
4

1 に答える 1

4

Timer クラスにはデータ メンバーとして Display オブジェクトがあり、Timer のコンストラクターはそれらすべて (AlarmH、AlarmM、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.
于 2013-03-04T01:43:45.530 に答える