如何封装一个函数,以便它只能由同一类中的一个其他函数调用?

How to encapsulate a function so that it can be called by only one other function within the same class?

本文关键字:一个 一类 函数调用 其他 封装 何封装 函数      更新时间:2023-10-16

有一个函数,我们只希望另一个函数成为以下函数的唯一调用者:

void bar(){
}
void foo(){
}
void baz(){
}

所有三个函数都位于同一类中。我们希望 foo(( 能够调用 bar((,但不允许 baz(( 调用 bar((。

到目前为止,这个答案似乎表明解决方案是在函数中创建一个 lambda 函数,或者在函数内创建一个结构/匿名结构。

我们可以在C++函数中包含函数吗?

有没有办法实现我们的目标,而不必在 foo(( 中移动 bar(( 即 - 无需在 foo 中创建 lambda 或结构

? 这只是一个探索它是否可能的技术实验——它不是关于我们"应该"做什么,而是简单地看看它是否可能。

基本上有 6 个区域可以找到,哪个函数正在调用哪个函数或由另一个函数调用。

  • 可能由链接器
  • 绝对由编译器
  • 由编辑。智能编辑器可以显示交叉引用
  • 通过第三方静态代码分析工具
  • 不幸的是,不是通过C++语言与代码
  • 所示
  • 是的,在运行时,有一些技巧

我猜,你指的是C++语言。

因此,在给定的约束下,答案是否定的

如果没有从 A::bar(( 调用,您可以立即从 A::foo(( 返回,如以下代码所示。但我不知道你的意思是不能从 A::bar(( 以外的任何东西调用有多严格。无论如何,如果我们删除 std::cout 行,优化可能会完全删除 a.baz((,渲染 A::foo(( 实际上无法从 A::baz(( 调用。

#include <iostream>
class A;
typedef void (A::*AFunc_t)() ; // = nullptr;
class A
{
public:
A() : Func(nullptr) {};
void bar() {
Func = &A::bar;
// do stuff
foo();
}
void foo() {
if (Func != &A::bar) {
std::cout << "foo is ***NOT*** called from bar so we return!" << "n";
return;
}
// do stuff
std::cout << "foo is called from bar so do something!" << "n";
}
void baz() {
Func = &A::baz;
// do stuff
foo();
}

AFunc_t Func;
};

int main()
{
A a;
a.baz();
a.bar();
return 0;
}
相关文章: