如何封装一个函数,以便它只能由同一类中的一个其他函数调用?
How to encapsulate a function so that it can be called by only one other function within the same class?
有一个函数,我们只希望另一个函数成为以下函数的唯一调用者:
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;
}
相关文章:
- 如何封装一个函数,以便它只能由同一类中的一个其他函数调用?
- 无法将指向类的成员函数的函数指针作为参数传递给同一类的另一个成员函数
- 如何将一个类的成员函数用作另一类的友元函数
- 在 c++ 中,同一类的一个对象如何分配给同一类的另一个对象?
- 如何在C++中将类的实例完全重新分配给同一类的另一个实例(然后删除原始对象)?
- 从同一类中的另一个方法调用方法时出错
- OpenCV:文件存储操作员">>"在一个项目中工作,但不在另一个项目中工作(在同一类上)
- 仅一个功能的链接错误.在同一类和CPP文件中具有相似签名的其他函数工作正常
- 让构造函数在其初始化列表中调用同一类的另一个构造函数是否有效
- 如何将两个类成员函数与同一类中的另一个函数一起添加
- 如何将一个方法中的值返回到同一类的另一个方法
- 为什么一个非平凡的成员需要为同一类中的匿名联合定义构造函数
- 将布局从一个类添加到另一类不起作用
- 将类成员函数作为参数从同一类的另一个成员函数传递
- C++ MySQL,使用在同一类内的另一个函数中的一个函数中建立的连接
- 如何从同一类的另一个成员函数调用函子
- 如何在 C++11 中将类中的函数作为参数传递给同一类中的另一个函数?
- 如何使用CPP中使用一个对象运行同一类的两个线程
- 从另一类调用另一个类的函数
- 如何创建一个可以对同一类的多个对象进行操作的函数,访问C++中的私有属性