Ошибка конструктора по умолчанию Нет соответствующей функции для вызова - PullRequest
1 голос
/ 07 августа 2020

В main() я создаю массив myAppointments и понимаю, чтобы он работал, мне нужно было бы создать конструктор по умолчанию в Appointments.h, но когда я это сделаю, я получаю эту ошибку:

no matching function for call to 'Time::Time()'
Appointment(){

Вот Main:

/*
 * Homework 4  -- UPDATE as needed
*/ 
    
#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
    
#include "Appointment.h"
using namespace std;
    
void callPrint (Time &TimeOrApptObject) { TimeOrApptObject.print(); }

int main(){
    int month, day, year, hour, minute,howLong;
    Appointment  myAppointments[19];
    
    ifstream HW4DataFileHandle;
    
    HW4DataFileHandle.open("Lab6Data.txt");
    while (!HW4DataFileHandle.eof( )) {
        for (int i = 1; i < 20; i++) {
            HW4DataFileHandle>>month;
            HW4DataFileHandle>>day;
            HW4DataFileHandle>>year;
            HW4DataFileHandle>>hour;
            HW4DataFileHandle>>minute;
            HW4DataFileHandle>>howLong;
            myAppointments[i] = Appointment( month, day, year, hour, minute, howLong);
        }
        cout <<"enter a month" <<endl;
        cin >> month;
        cout <<"enter a day" <<endl;
        cin >> day;
        cout <<"enter a year"<<endl;
        cin >> year;
        Date myDate( month, day, year);
    
        cout <<"Appointments for" << month <<"/" << day <<"/" << year <<":"<< endl;
    
        for (int i = 0; i <13; i++){
            if ( myAppointments[i]==Date myDate )
            {
                Time thisTime = myAppointments[i];
                thisDate.print();
                cout << endl;
            } 
        }
    }

А вот файлы заголовков:

Date.H

// Date.h -- Class Date    UPDATE  as needed
#ifndef DATE_H
#define DATE_H

class Date  {  
private:
    int month;
    int day;
    int year;
public:
    Date(int m, int d, int y) : month(m), day(d), year(y)
    {
    }

    friend bool friendTorCompare2Dates (const Date&,const Date& );
};

bool friendTorCompare2Dates (const Date& Right, const Date& Left)
{
    if (Right.month == Left.month && Right.day == Left.day )
        return true;
    else
        return false;
}
    
#endif

Time.H

//Time.h -- Class Time UPDATE  as needed
using namespace std;
#include<iostream>
#ifndef TIME_H
#define TIME_H

class Time {
private :
    int hour; int minute;
public:
    Time(int h, int m) : hour(h)
    {
    }
    virtual void print() {
        cout << hour << " " << minute <<" "  ;
    }
};

#endif

Appointment.h

// Appointment.h -- Class Appointment   UPDATE as needed
//
    
using namespace std;
#include "Time.h"
#include "Date.h"
#ifndef APPOINTMENT_H
#define APPOINTMENT_H

class Appointment:  public Date, public Time {  
private:
    int howLong;
public:
    Appointment(int month, int day, int year, int hour, int minute, int howLong) : 
        Date(month, day, year), Time(hour, minute), howLong(howLong)
    {
    }

    Appointment(){
        month;
        day;
        year;
        hour;
        minute;
        howLong;    
    }
};
        
#endif

Что мне нужно изменить, чтобы мой конструктор по умолчанию в Appointment работал? Если вы заметите что-то еще или у вас возникнут другие вопросы по моему вопросу, дайте мне знать. Буду признателен, если вы включите в свой ответ пример.

Ответы [ 2 ]

4 голосов
/ 07 августа 2020

Эта строка:

Appointment  myAppointments[19];

вызовет конструктор по умолчанию Appointment для каждого элемента.

Конструктор по умолчанию не вызывает явно конструктор Time, поэтому будет вызван конструктор по умолчанию Time, которого не существует. То же самое с Date.

Вы можете восстановить конструктор по умолчанию следующим образом:

class Time {
 // ...
 public:
  Time() = default;
};

Чтобы получить разумное поведение по умолчанию, вы должны предоставить начальные значения по умолчанию для членов вашего класса, например

class Time {
 private :
   int hour = 0; 
   int minute = 0;
public:
   // ...
};
1 голос
/ 07 августа 2020

Когда вы объявляете массив Appointment myAppointments[19];, конструктор по умолчанию для Appointment используется сразу для всех 19 элементов. Однако для Date и Time не определены конструкторы по умолчанию, но конструктор по умолчанию Appointment попытается вызвать их оба неявно, поэтому вы видите ошибку, поскольку они не существуют.

Итак, у вас есть 4 различных способа исправить это:

  1. make Appointment вызов конструктора по умолчанию Date и Time конструкторы, не являющиеся конструкторами по умолчанию явно ( как и ваш другой Appointment конструктор), передавая им значения по умолчанию:

    Appointment() : 
        Date(0, 0, 0), Time(0, 0), howLong(0)
    {
    }
    
  2. дайте Date и Time свои собственные конструкторы по умолчанию, например:

    class Date  {  
    private:
        int month;
        int day;
        int year;
    public:
        Date() : month(0), day(0), year(0)
        {
        }
    
        Date(int m, int d, int y) : month(m), day(d), year(y)
        {
        }
    
        ...
    };
    
    class Time {
    private :
        int hour;
        int minute;
    public:
        Time() : hour(0), minute(0)
        {
        }
    
        Time(int h, int m) : hour(h), minute(m)
        {
        }
    
        ...
    };
    

    Альтернативно:

    class Date  {  
    private:
        int month;
        int day;
        int year;
    public:
        Date(int m = 0, int d = 0, int y = 0) : month(m), day(d), year(y)
        {
        }
    
        ...
    };
    
    class Time {
    private :
        int hour;
        int minute;
    public:
        Time(int h = 0, int m = 0) : hour(h), minute(m)
        {
        }
    
        ...
    };
    

    Альтернативно (только C ++ 11 и новее):

    class Date  {  
    private:
        int month = 0;
        int day = 0;
        int year = 0;
    public:
        Date() = default;
        // or:
        // Date() : Date(0, 0, 0) {}
    
        Date(int m, int d, int y) : month(m), day(d), year(y)
        {
        }
    
        ...
    };
    
    class Time {
    private :
        int hour = 0;
        int minute = 0;
    public:
        Time() = default;
        // or:
        // Time() : Time(0, 0) {}
    
        Time(int h, int m) : hour(h), minute(m)
        {
        }
    
        ...
    };
    
  3. явно создает элементы массива, используя placement-new, поэтому вы можете использовать для них конструктор, отличный от конструктора Appointment, например:

    typedef unsigned char AppointmentBuf[sizeof(Appointment)];
    // better:
    // #include <type_traits>
    // using AppointmentBuf = std::aligned_storage<sizeof(Appointment), alignof(Appointment)>::type;
    
    int main(){
        AppointmentBuf myAppointments[19];
    
        ...
    
        for (int i = 0; i < 19; i++) {
            ...
            new (&myAppointments[i]) Appointment(month, day, year, hour, minute, howLong);
        }
    
        ...
    
        for (int i = 0; i < 19; i++) {
            Appointment &appt = reinterpret_cast<Appointment&>(myAppointments[i]);
            // use appt as needed...
        }
    
        ...
    
        // cleanup
        for (int i = 0; i < 19; i++) {
            reinterpret_cast<Appointment&>(myAppointments[i]).~Appointment();
        }
    
        return 0;
    }
    
  4. Измените массив, чтобы он содержал Appointment* указателей, а затем динамически создайте элементы массива с помощью new, используя конструкцию Appointment не по умолчанию или, например:

    int main(){
        Appointment* myAppointments[19] = {};
    
        ...
    
        for (int i = 0; i < 19; i++) {
            ...
            myAppointments[i] = new Appointment(month, day, year, hour, minute, howLong);
        }
    
        ...
    
        for (int i = 0; i < 19; i++) {
            // use myAppointments[i] as needed...
        }
    
        ...
    
        // cleanup
        for (int i = 0; i < 19; i++) {
            delete myAppointments[i];
        }
    
        return 0;
    }
    

    Альтернативно (только C ++ 11 или новее):

    #include <memory>
    
    int main(){
        std::unique_ptr<Appointment> myAppointments[19];
    
        ...
    
        for (int i = 0; i < 19; i++) {
            ...
            myAppointments[i] = std::make_unique<Appointment>(month, day, year, hour, minute, howLong);
        }
    
        ...
    
        for (int i = 0; i < 19; i++) {
            // use myAppointments[i] as needed...
        }
    
        ...
    
        // no manual cleanup needed
    
        return 0;
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...