首页 > 解决方案 > 数据成员指针被共享 C++

问题描述

我创建了两个类 SystemClock 用于显示当前时间(通过从 ctime 创建指向 struct tm 的指针)和另一个名为 CustomClock 的类,它根据用户给出的小时、分钟和秒创建时间对象。CustomClass 继承自 SystemClock 并且 SystemClock 有一个 display 方法以小时:分钟:秒格式显示时间。

出于某种原因,SystemClock 中的 tm* 字段被所有对象共享。因为当我创建一个 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;
}

当我通过创建值类型数据成员而不是指针类型数据成员来完成上述实现时,它可以正常工作。我无法理解指针如何以及为什么被所有对象共享。

标签: c++datetimepointers

解决方案


这就是您修复代码的方式(正如 Raffallo 所指出的)

class SystemClock {

public:
    tm time;
    SystemClock() {
        time_t now = std::time(0);
        time = *localtime(&now);
    }
...

推荐阅读