Как создавать массивы объектов с классами, имеющими конструкторы на C

#c #arrays #class #constructor

#c #массивы #класс #конструктор

Вопрос:

 class Time {
private:
    int hour = 0;
    int minute = 0;
public:
    Time(int hour, int minute);
    void setHour(int hour);
    void setMinute(int minute);
    int getHour();
    int getMinute();
    void print();
    void advance();
};
Time::Time(int h, int m) // DONE
{
    hour = h;
    minute = m;
    if (hour > 23) 
    {
        hour = 0;
    }
    if (minute > 59) 
    {
        minute = 0;
    }
}
void Time::setHour(int h) // DONE
{
    if (h > 23) 
    {
        hour = 0;
    }
    else 
    {
        hour = h;
    }
}
void Time::setMinute(int m) // DONE
{
    if (m > 59) 
    {
        minute = 0;
    }
    else 
    {
        minute = m;
    }
}
int Time::getHour() // DONE
{
    return hour;
}
int Time::getMinute() // DONE
{
    return minute;
}
void Time::print() // DONE
{
    string period;
    string minutezero;
    
    if (hour > 12) 
    {
        hour = hour - 12;
        period = "PM";
    }
    else if (hour < 13) 
    {
        period = "AM";
    }
    if (hour == 0) 
    {
        hour = 12;
        period = "AM";
    }
    if (minute < 10)
    {
        cout << hour << ":" << "0" << minute << " " << period;
    }
    else if (minute > 9)
    {
        cout << hour << ":" << minute << " " << period;
    }

}
void Time::advance() // DONE
{
    minute = minute   1;
    if (minute == 60) 
    {
        minute = 0;
        hour = hour   1;
    }
    if (hour == 24) 
    {
        hour = 0;
    }
}
  

В моей функции int main я хотел бы создать массив, подобный
Время t [5], которое будет содержать 5 временных объектов. Как бы я это закодировал?

Вот что говорит мой модуль слово в слово:

** Измените класс Time, чтобы настроить конструкторы, чтобы в драйвере можно было создавать следующие объекты Time. Настройте временной массив, как указано ниже, и также распечатайте время в драйвере (можно добавить в обычную версию и отправить одну версию).

Время t1; // час: 0, минута: 0, 12:00

Время t2(8); // час: 8, минута: 0, 8:00 утра

Время t3(13, 30); // час: 13, минута: 30, 1:30 вечера

Время t4(25, 5); // час: 0, минута: 5, 12:05

Время t4(12, 60); // час: 12, минута: 0, 12:00 PMI**

Комментарии:

1. Вашему Time классу нужен конструктор по умолчанию. В настоящее время у него есть только конструктор, который принимает два параметра. Я предлагаю вам создать другой конструктор, который не принимает параметров и просто инициализирует свои элементы нулем.

2. На самом деле, при чтении последующих требований кажется, что вам также нужно поддерживать построение только часом. В этом случае вам может сойти с рук объявление значений параметров по умолчанию для существующего конструктора.

3. подождите .. исходное требование предполагает, что в день было 25 часов? lol (24 часа в сутки: 24 == 0)

Ответ №1:

Как указал Пэдди в комментарии, вам нужен конструктор по умолчанию, который выглядел бы примерно так:

 Time::Time() : hour(0), minute(0) { }
  

И вам также нужен конструктор только с часом в качестве параметра

 Time::Time(int h) : hour(h), minute(0) {
    if (hour > 23) hour = 0;
}
  

После этого ваш класс будет выглядеть примерно так

 public:
    Time();
    Time(int h);
    Time(int hour, int minute);
    void setHour(int hour);
    ...
  

Ответ №2:

Например

 #include <algorithm>
#include <vector>
#include <iterator>
 
int main(){
    std::vector<Time> t;
    std::fill_n(std::back_inserter(t), 5, Time(0, 0));
}
  

Или использовать указатели

 std::array<std::unique_ptr<Time>, 5> t;  // std::unique_ptr<Time> t[5];
  

В соответствии с требованием Time t1; // hour: 0, minute: 0, 12:00 AM вы должны добавить и реализовать конструктор по умолчанию Time::Time() , или еще лучше, если вы создадите только один Time::Time(int hour = 0, int minute = 0) со значениями параметров по умолчанию.

Небольшое обновление:

 class Time {
private:
    int hour = 0;
    int minute = 0;
public:
    Time(int hour = 0, int minute = 0);
    // skipped