C++ 共享的数据成员指针c++;

C++ 共享的数据成员指针c++;,c++,datetime,pointers,C++,Datetime,Pointers,我创建了两个类SystemClock,用于显示当前时间(通过从ctime创建指向struct tm的指针),另一个类CustomClock,用于根据用户给定的小时、分钟和秒创建时间对象。 CustomClass继承自SystemClock,SystemClock具有以小时:分钟:秒格式显示时间的显示方法 出于某种原因,SystemClock中的tm*字段被所有对象共享。因为当我创建一个CustomClock对象时,说c1(1,2,3)和c2(4,5,6)并调用c1.display和c2.disp

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

出于某种原因,SystemClock中的tm*字段被所有对象共享。因为当我创建一个CustomClock对象时,说c1(1,2,3)和c2(4,5,6)并调用c1.display和c2.display,它们都在打印4:5:6。(为了清楚起见,请参阅下面的代码)

代码:

#包括
#包括
#包括
类系统时钟{
公众:
tm*时间;
系统时钟(){
时间现在=标准::时间(0);
时间=本地时间(&现在);
}
无效显示(){
标准::cout tm_hour tm_min tm_sec设置时间(小时、分钟、秒);
}
CustomClock(CustomClock&c){
std::couttm_hour,c.time->tm_min,c.time->tm_sec);
}
无效设置时间(整数小时、整数分钟、整数秒){
此->时间->tm_小时=小时;
此->时间->tm_min=分钟;
这->时间->tm_秒=秒;
}
};
int main(){
自定义时钟c1(1,2,3);
自定义时钟c2(4,5,6);
c2.display();//打印时间:4:5:6
c1.display();//打印时间:4:5:6而不是1:2:3
CustomClock c3(c1);//打印当前时间,而不是1:2:3
c3.显示();
返回0;
}

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

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


指针被剪切,因为
localtime
方法正在返回指向内部对象的指针

返回的值指向内部对象


该函数还访问和修改共享的内部对象


您可以在以下网站上阅读更多信息:

您应该使用
localtime\u r
。这允许您将内部对象内容复制到用户内存中。

“返回的值指向一个内部对象,该对象的有效性或值可能会因随后对gmtime或localtime的任何调用而改变。”“该函数还访问和修改共享的内部对象…”感谢@Raffallo的帮助,我理解了发生这种情况的原因。由于我面临的主要问题是无法找出这种行为的原因,如果您添加答案,我很愿意接受您的答案。如果没有共享,为什么图书馆会提供它作为指针?嗨@stefan感谢您的解决方案,但正如我在问题中提到的,我能够通过使用值类型而不是指针类型来解决这个问题,指针类型只是解引用。我面临的主要问题是无法理解拉法罗所指出的行为。我觉得他应该是那个得到公认答案的人。
#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;
}
class SystemClock {

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