【问题标题】:How do I make a function only callable from another function?如何使一个函数只能从另一个函数调用?
【发布时间】:2013-05-21 03:46:58
【问题描述】:
//function declerations
void func_A();
void func_B();
void func_SubA();

//main
int main(){ ... }

//function definitions
void func_A(){ ... }
void func_B(){ ... }
void func_SubA(){ ... }

确保 func_SubA() 只能在 func_A() 内部调用的最佳方法是什么?
如果 func_B() 试图调用 func_SubA(),我想收到一个编译器错误。

【问题讨论】:

    标签: c++ function c++11 lambda lexical-closures


    【解决方案1】:

    您可以将要限制访问的函数声明为类的私有成员,然后使用友谊来授予访问权限。

    class Balloon 
    {
    private: // private is the default. we just want to be explicit
        friend void Ken();
        friend void Barbie();
    
        static void Pop();
    };
    
    void Ken() {
        Balloon::Pop(); // We are allowed to pop it!
    }
    
    void Barbie() {
        Balloon::Pop(); // We are allowed to pop it too!
    }
    
    void Jack() {
        Balloon::Pop(); //  Access Denied! we must be in a time out!
    }
    

    【讨论】:

    • +1。你可以省略Barbie - 它只会使答案更长。为什么使用struct
    • @Elazar 我整天都在使用 struct ;)
    • @Elazar 和我尝试在示例中使用三个元素以避免任何混淆或其他问题
    • 你得到了 cmets :)
    【解决方案2】:

    另一种方法是将func_A()func_SubA() 的定义放在不同的翻译单元(cpp 文件)中,并通过将static 设置为static 或将其放在匿名命名空间中使func_SubA() 在此文件之外不可见:

    // FILE main.cpp
    //function declarations: possibly in a header file
    void func_A();
    void func_B();
    // don't declare func_SubA() here
    int main(){ /* ... */ }
    void func_B(){ /* ... */ } // could also have its onw cpp file
    // EOF main.cpp
    
    // FILE func_A.cpp
    static void func_SubA(){ /* ... */ }
    /* or
    namespace {
        void func_SubA(){ ... }
    }
    */
    void func_A(){ /* calls func_SubA() */ }
    // EOF func_A.cpp
    

    另一种方法,正如 JesseTG 所建议的,我在这里要明确说明的是,使用 lambda 表达式:

    //function declarations
    void func_A();
    void func_B();
    // don't declare func_SubA();
    
    int main(){ /* ... */ }
    
    //function definitions
    void func_A(){
        // define func_SubA through a lambda
        auto func_SubA = [](){ /* the body of func_SubA */ };
        // ...
        func_SubA(); // calls func_SubA()
        // ...
    }
    void func_B(){ /* ... */}
    

    【讨论】:

      【解决方案3】:

      您可以使用通常的面向对象方式(私有方法等)执行此操作,也可以使用 lambda 函数,这是 C++11 中的一个新特性。您可以阅读它们herehere,它们并不难使用。 Lambda 函数允许您访问任何包含它们的代码块的本地变量。

      【讨论】:

      • 在这种情况下私有方法有什么帮助?
      • 将所有相关函数集中到一个类中,将它们公开,并引入一些私有辅助方法。因为 C++ 不像 Java 或 C# 那样强制面向对象,但是,我认为很多 C++ 程序员不会喜欢你这样做。
      【解决方案4】:

      函数声明也可以是本地的。如果你把 func_SubA 的前向声明 inside funcA(),你应该很好。

      【讨论】:

      • 但如果您愿意,可以在任何其他函数中声明它。
      • 这仅在尝试调用之前未定义 func_SubA() 时有效。我不确定要求这样的事情总是合理的
      • 两个优点。我认为无论如何其他答案都更好。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-19
      • 2021-08-24
      • 2020-11-17
      • 2021-06-05
      • 1970-01-01
      • 2021-07-03
      • 2015-07-03
      相关资源
      最近更新 更多