[英]In c++, if a member pointer point to some data, how to protect that data from being modified?
[英]data member pointer being shared c++
我創建了兩個類 SystemClock,用於顯示當前時間(通過從 ctime 創建指向 struct tm 的指針)和另一個名為 CustomClock 的 class,它根據用戶給出的小時、分鍾和秒創建時間 object。 CustomClass 繼承自 SystemClock 並且 SystemClock 有一個 display 方法以小時:分鍾:秒格式顯示時間。
出於某種原因,SystemClock 中的 tm* 字段被所有對象共享。 因為當我創建一個 CustomClock object 說 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);
}
...
指針被剪切,因為localtime
方法正在返回指向內部 object 的指針。
返回值指向內部 object...
和
function 還訪問和修改共享的內部 object...
你可以閱讀更多關於它的信息: http://www.cplusplus.com/reference/ctime/localtime/
您應該使用localtime_r
。 這允許您將內部 object 內容復制到用戶 memory 中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.