Я создал два класса SystemClock, которые используются для отображения текущего времени (путем создания указателя на struct tm из ctime) и еще один класс CustomClock, который создает объект времени из часов, минут и секунд, заданных пользователем. CustomClass наследуется от SystemClock, а SystemClock имеет метод отображения для отображения времени в формате часы: минуты: секунды.
По какой-то причине поле tm * в SystemClock совместно используется всеми объектами. Потому что, когда я создаю объект CustomClock, скажите c1 (1,2,3) и c2 (4,5,6) и вызовите c1.display и c2.display, оба они печатают 4: 5: 6. (См. Код ниже. для ясности)
Код:
#include <chrono>
#include <ctime>
#include <iostream>
class SystemClock {
public:
tm* time;
SystemClock() {
time_t now = std::time(0);
time = localtime(&now);
}
void display() {
std::cout << "Time: "<< this->time->tm_hour << ":";
std::cout << this->time->tm_min << ":";
std::cout << this->time->tm_sec << std::endl;
}
};
class CustomClock : public SystemClock {
public:
// CustomClock():SystemClock() {}
CustomClock(int hours, int minutes, int seconds) {
this->set_time(hours,minutes,seconds);
}
CustomClock(CustomClock &c) {
std::cout<<"inside copy constructor";
c.display();
this->set_time(c.time->tm_hour,c.time->tm_min,c.time->tm_sec);
}
void set_time(int hours, int minutes, int seconds) {
this->time->tm_hour = hours;
this->time->tm_min = minutes;
this->time->tm_sec = seconds;
}
};
int main() {
CustomClock c1(1,2,3);
CustomClock c2(4,5,6);
c2.display(); //prints Time: 4:5:6
c1.display(); //prints Time: 4:5:6 instead of 1:2:3
CustomClock c3(c1); //prints current time instead of 1:2:3
c3.display();
return 0;
}
Когда я выполнил описанную выше реализацию, создав член данных типа значения вместо члена данных типа указателя, он работает правильно. Я не могу понять, как и почему указатель используется всеми объектами.