c++ - 数据成员指针被共享 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;
}
当我通过创建值类型数据成员而不是指针类型数据成员来完成上述实现时,它可以正常工作。我无法理解指针如何以及为什么被所有对象共享。
解决方案
这就是您修复代码的方式(正如 Raffallo 所指出的)
class SystemClock {
public:
tm time;
SystemClock() {
time_t now = std::time(0);
time = *localtime(&now);
}
...
推荐阅读
- apache-spark - Azure 数据工厂 v2 中的 HDInsight/Spark 活动没有为 spark-submit 指定 --files 参数的选项
- reactjs - 在 ReactJS 的功能组件中声明一个变量
- google-sheets - Google表格公式中的多个REGEXEXTRACT
- javascript - d3-sankey 按组显示和拖动不起作用
- reactjs - 从反应发送带有授权标头的多部分/表单数据
- ios - 在一个 UIView 内绘制多个矩形
- pdo - 在 PHP 中遇到 PDO 问题
- openstreetmap - 如何使用 OSMFilter 仅从 DB 中提取方式标记而无需其他实体
- php - Laravel Http 客户端使用 PUT 方法接收 419 响应 200 使用 GET
- flutter - 是否有任何键盘快捷键可以覆盖 Visual Studio Flutter 中的超类方法