1
//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()
,我想收到编译器错误。

4

4 回答 4

4

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

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!
}
于 2013-05-25T20:39:54.060 回答
2

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

// 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(){ /* ... */}
于 2013-05-26T17:01:33.397 回答
1

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

于 2013-05-25T20:37:41.833 回答
0

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

于 2013-05-25T20:35:21.450 回答