【问题标题】:How to encapsulate a function so that it can be called by only one other function within the same class?如何封装一个函数,使其只能被同一个类中的另一个函数调用?
【发布时间】:2020-07-01 01:46:03
【问题描述】:

有一个函数,我们只希望另一个函数作为其唯一调用者:

void bar(){

}

void foo(){

}

void baz(){

}

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

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

Can we have functions inside functions in C++?

有没有一种方法可以实现我们的目标,而无需在 foo() 中移动 bar() 即 - 无需在 foo 中创建 lambda 或 struct ?

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

【问题讨论】:

  • 也许这可以帮助你:stackoverflow.com/a/4324780/13687491
  • @nanu_nana 谢谢!但这与我在问题中包含的链接完全相同! :)
  • 不,这是不可能的。我首先会强烈质疑这样做的理由。
  • @cdhowie 我用粗体突出显示——我们只是想看看在 c++ 中什么是可能的。不要认为它值得-1。 :)
  • 你为什么认为我投了反对票?那么,这个问题的答案是否定的——除非你把有问题的函数移到允许调用它的函数中。没有比private 更严格的访问修饰符。

标签: c++ c++11


【解决方案1】:

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

  • 可能由链接器
  • 绝对由编译器决定
  • 由编辑。智能编辑器可以显示交叉引用
  • 第三方静态代码分析工具
  • 很遗憾,C++语言的代码没有如图所示
  • 是的,在运行时,有一些技巧

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

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

【讨论】:

    【解决方案2】:

    如果没有从 A::bar() 调用,您可以立即从 A::foo() 返回,如下面的代码所示。但我不知道你的意思是多么严格,不能从 A::bar() 以外的任何东西callable。在任何情况下,如果我们删除 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;
    }
    

    【讨论】:

      猜你喜欢
      • 2013-05-21
      • 1970-01-01
      • 2017-07-19
      • 2021-06-05
      • 1970-01-01
      • 2018-08-17
      • 1970-01-01
      • 1970-01-01
      • 2020-07-03
      相关资源
      最近更新 更多