общий указатель элемента данных c ++ - PullRequest
2 голосов
/ 18 июня 2020

Я создал два класса 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;
}

Когда я выполнил описанную выше реализацию, создав член данных типа значения вместо члена данных типа указателя, он работает правильно. Я не могу понять, как и почему указатель используется всеми объектами.

Ответы [ 3 ]

2 голосов
/ 18 июня 2020

Указатель срезан, потому что метод localtime возвращает указатель на внутренний объект.

Возвращаемое значение указывает на внутренний объект ...

и

Функция также обращается к общему внутреннему объекту и изменяет его ...

Подробнее об этом можно прочитать на: http://www.cplusplus.com/reference/ctime/localtime/

2 голосов
/ 18 июня 2020

Вот как вы исправляете свой код (как указал Раффалло)

class SystemClock {

public:
    tm time;
    SystemClock() {
        time_t now = std::time(0);
        time = *localtime(&now);
    }
...
0 голосов
/ 18 июня 2020

Вы должны использовать localtime_r. Это позволяет копировать содержимое внутреннего объекта в память пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...