首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >共享c++的数据成员指针

共享c++的数据成员指针
EN

Stack Overflow用户
提问于 2020-06-18 09:56:10
回答 3查看 72关注 0票数 2

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

由于某种原因,所有对象都共享SystemClock中的tm*字段。因为当我创建一个CustomClock对象时,比如c1(1,2,3)和c2(4,5,6),调用c1.display和c2显示都是打印4:5:6。

代码:

代码语言:javascript
复制
#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;
}

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-06-18 11:27:02

指针被剪切,因为localtime方法将指针返回到内部对象。

返回的值指向内部对象.

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

你可以在:http://www.cplusplus.com/reference/ctime/localtime/上读到更多关于它的信息。

票数 2
EN

Stack Overflow用户

发布于 2020-06-18 11:02:16

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

代码语言:javascript
复制
class SystemClock {

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

Stack Overflow用户

发布于 2020-06-18 12:32:14

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62447327

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档