Я бы хотел поддержать вас.
Первое и самое важное: в современном 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;
}
Надеюсь, это поможет