我创建了两个类SystemClock,它用于显示当前时间(通过从ctime创建指向struct的指针)和另一个名为CustomClock的类,它从用户给定的小时、分钟和秒创建时间对象。CustomClass从SystemClock继承而来,SystemClock有一个以小时为单位显示时间的显示方法:分钟:秒格式。
由于某种原因,所有对象都共享SystemClock中的tm*字段。因为当我创建一个CustomClock对象时,比如c1(1,2,3)和c2(4,5,6),调用c1.display和c2显示都是打印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;
}当我通过创建值类型数据成员而不是指针类型数据成员来实现上述实现时,它正确工作。我无法理解指针是如何和为什么被所有对象共享的。
发布于 2020-06-18 11:27:02
指针被剪切,因为localtime方法将指针返回到内部对象。
返回的值指向内部对象.
和
函数还访问和修改共享的内部对象.
你可以在:http://www.cplusplus.com/reference/ctime/localtime/上读到更多关于它的信息。
发布于 2020-06-18 11:02:16
这就是如何修复代码(正如Raffallo所指出的)。
class SystemClock {
public:
tm time;
SystemClock() {
time_t now = std::time(0);
time = *localtime(&now);
}
...发布于 2020-06-18 12:32:14
您应该使用localtime_r。这允许您将内部对象内容复制到用户内存中。
https://stackoverflow.com/questions/62447327
复制相似问题