是否可以限制成员函数访问成员变量?
Is it possible to restrict a member function from accessing a member variable?
我有一个帖子 class 与此类似:
class thr {
void run() {
for (;;) {
// block on a queue
// do some processing
++loops_;
}
}
void get_metrics(int& qps) {
std::chrono::steady_clock::time_point now = std::chrono::steady_clock::now();
double delta = std::chrono::duration<double>(now - last_metrics_time_).count();
qps = std::round(loops_ / delta);
loops_ = 0;
last_metrics_time_ = now;
}
static std::atomic<int> loops_;
static std::chrono::steady_clock::time_point last_metrics_time_;
};
std::atomic<int> thr::loops_ { 0 };
std::chrono::steady_clock::time_point thr::last_metrics_time_ {
std::chrono::steady_clock::now() // initial value: when the program starts
};
这种情况有很多 运行。还有另一个线程不时调用 get_metrics()。
我想阻止 run()
访问 last_metrics_time_
,因为它不是原子的(只有一个指标收集器线程,所以没有问题)。
将 last_metrics_time_
设为 get_metrics
的局部静态变量似乎不正确,因为它会在首次调用 get_metrics
时初始化,而不是在程序启动时初始化。这将导致 delta
的值接近于零(因为 now
将非常接近 last_metrics_time_
)并且第一次调用会返回一个巨大的值。
没有
但是您可以将这个多重职责 class 拆分为两个单一职责 classes:一个 运行 循环,更新 loops_
,并提供读取-只能访问它,另一个计算指标并记录时间。然后每个功能将只能访问它需要的内容。
我有一个帖子 class 与此类似:
class thr {
void run() {
for (;;) {
// block on a queue
// do some processing
++loops_;
}
}
void get_metrics(int& qps) {
std::chrono::steady_clock::time_point now = std::chrono::steady_clock::now();
double delta = std::chrono::duration<double>(now - last_metrics_time_).count();
qps = std::round(loops_ / delta);
loops_ = 0;
last_metrics_time_ = now;
}
static std::atomic<int> loops_;
static std::chrono::steady_clock::time_point last_metrics_time_;
};
std::atomic<int> thr::loops_ { 0 };
std::chrono::steady_clock::time_point thr::last_metrics_time_ {
std::chrono::steady_clock::now() // initial value: when the program starts
};
这种情况有很多 运行。还有另一个线程不时调用 get_metrics()。
我想阻止 run()
访问 last_metrics_time_
,因为它不是原子的(只有一个指标收集器线程,所以没有问题)。
将 last_metrics_time_
设为 get_metrics
的局部静态变量似乎不正确,因为它会在首次调用 get_metrics
时初始化,而不是在程序启动时初始化。这将导致 delta
的值接近于零(因为 now
将非常接近 last_metrics_time_
)并且第一次调用会返回一个巨大的值。
没有
但是您可以将这个多重职责 class 拆分为两个单一职责 classes:一个 运行 循环,更新 loops_
,并提供读取-只能访问它,另一个计算指标并记录时间。然后每个功能将只能访问它需要的内容。