Сборка массива char с разными целыми числами для напоминания даты и времени - PullRequest
0 голосов
/ 18 июня 2019

Мне нужно создать метод, который возвращает массив символов в формате даты и времени.

class DateTime {

    int *_day, *_month, *_year, *_hours, *_minutes;

public:

    DateTime(int day = 1, int month = 1, int year = 2000, int hours = 0, int minutes = 0) {
        _day= new int(day);
        _month= new int(month);
        _year= new int(year);
        _hours = new int(hours);
        _minutes= new int(minutes);
    }
}

char * ToCharArray() {

}

В данном назначении класса я должен использовать указатели int и присваивать их значения в main.

Я пробовал stringstream, чтобы преобразовать целые числа в символы, а затем пытался собрать ихв массиве значимым образом, но это не сработало для меня.

Я попытался вручную ввести значения в массив, используя

temp[0] = '0' + *_date;

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

Ожидаемый результат будет примерно таким:

DateTime date1(19, 6, 2018, 10, 15); 
cout << date1.ToCharArray() << endl;

// outputs: 19.6.2018 10:15

1 Ответ

0 голосов
/ 20 июня 2019

Я бы хотел поддержать вас.

Первое и самое важное: в современном C ++ вы никогда не должны (или как можно меньше) использовать необработанные указатели для управления памятью.Всегда используйте std :: unique: ptr или std :: shared_ptr.

Риск создания утечек памяти при использовании необработанных указателей для динамического управления памятью слишком высок.Для ваших целей, имея закрытый класс DateTime с защищенными членами даты / времени, я не могу представить какой-либо разумный вариант использования указателей вообще.Если это для академических целей, тогда хорошо.Иначе, в этом просто нет необходимости.

Если вы хотите использовать указатели и динамическое выделение памяти, вы должны удалить обновленную память в деструкторе класса.В противном случае у вас есть гарантированные утечки памяти.И не забудьте инициализировать указатели с помощью nullptr.

Теперь к вашему вопросу:

Если вы просто хотите вывести свой класс DateTime в любой ostream, то вы должны переопределить оператор << в вашемучебный класс.Вы можете увидеть пример в приведенном ниже коде. </p>

Если вы хотите поместить данные вашего класса в строку, используйте std :: string.Вы не должны использовать символ *.

Если вы все еще хотите использовать символ *, я также добавил пример.Но, пожалуйста, имейте в виду.Это только для чтения.И только действительный, поскольку ling, поскольку dateTimeString находится в области видимости.

Итак, agin, старайтесь избегать использования необработанных указателей.В этом нет необходимости.

В приведенном ниже примере я поместил 2 класса с, в начале, более значимым подходом без указателей (класс DateTime1) и класс с указателями (класс DateTime2).Для тестов вы можете выбрать класс, который будет использоваться в операторе using.

#include <iostream>
#include <string>
#include <iomanip>
#include <sstream>

class DateTime1     // Version 1
{
public:
    DateTime1() {}      // Default. Does nothing. Use standard default values
    DateTime1(int d, int m, int y, int h, int min) : day(d), month(m), year(y), hours(h), minutes(min) {}
    // Option 1. Overwrite the ostream operator
    friend std::ostream& operator<<(std::ostream& os, const DateTime1& dt) { return os << dt.day << '.' << dt.month << '.' << dt.year << ' ' << std::setfill('0') << std::setw(2) << dt.hours << ':' << std::setw(2) << dt.minutes; }
    // Option 2. Create a std String
    std::string toString() {std::ostringstream oss; oss << day << '.' << month << '.' << year << ' ' << std::setfill('0') << std::setw(2) << hours << ':' << std::setw(2) << minutes; return oss.str();}
protected:
    int day{ 1 };   int month{ 1 }; int year{ 1970 };   int hours{ 0 }; int minutes{ 0 };
};


class DateTime2     // Version 2
{
public:
    explicit DateTime2(int d, int m, int y, int h, int min) : day(new int(d)), month(new int(m)), year(new int(y)), hours(new int(h)), minutes(new int(min)) {}
    // MUST delete dynamically allocated memory
    ~DateTime2() { delete day; delete month; delete year; delete hours; delete minutes; }

    // Option 1. Overwrite the ostream operator
    friend std::ostream& operator<<(std::ostream& os, const DateTime2& dt) { return os << *dt.day << '.' << *dt.month << '.' << *dt.year << ' ' << std::setfill('0') << std::setw(2) << *dt.hours << ':' << std::setw(2) << *dt.minutes; }
    // Option 2. Create a std String
    std::string toString() { std::ostringstream oss; oss << *day << '.' << *month << '.' << *year << ' ' << std::setfill('0') << std::setw(2) << *hours << ':' << std::setw(2) << *minutes; return oss.str(); }
protected:
    int* day{ nullptr }; int* month{ nullptr }; int* year{ nullptr };   int* hours{ nullptr };  int* minutes{ nullptr };
};

using DateTime = DateTime2;   // Seletc DateTime1 or DateTime2

int main()
{
    std::cout << DateTime(19, 6, 2018, 10, 15) << '\n';

    // or
    DateTime date1(19, 6, 2018, 10, 15);    // Call the contructor
    std::cout << date1 << '\n';

    // or
    std::string dateTimeString{ date1.toString() };     // Initialize variable dateTimeString
    const char* dateTimeCharP{ dateTimeString.c_str() };

    std::cout << dateTimeString << '\n';
    std::cout << dateTimeCharP << '\n';

    return 0;
}

Надеюсь, это поможет

...