C++ 如何在c+中使一个函数只被一个函数看到+;?

C++ 如何在c+中使一个函数只被一个函数看到+;?,c++,C++,我怎样才能使一个函数只被调用它的函数看到 将我想要隐藏的函数定义为私有函数是不够的,因为类中的其他公共函数仍然可以看到它 现在我使用lambda表达式在函数中定义匿名函数。有更好的解决方案吗?除了使用lambda(您已拒绝使用),您还可以在自己的编译单元中实现您的函数,并在该编译单元中的中编写支持函数 但是支持函数将在类之外,因此您必须传递它所需的所有参数。这可能会变得非常笨拙,尽管不会比一个很长的lambda捕获列表更糟糕。除了使用lambda(您已经拒绝了它),您还可以在自己的编译单元中实现

我怎样才能使一个函数只被调用它的函数看到

将我想要隐藏的函数定义为私有函数是不够的,因为类中的其他公共函数仍然可以看到它

现在我使用lambda表达式在函数中定义匿名函数。有更好的解决方案吗?

除了使用lambda(您已拒绝使用),您还可以在自己的编译单元中实现您的函数,并在该编译单元中的中编写支持函数

但是支持函数将在类之外,因此您必须传递它所需的所有参数。这可能会变得非常笨拙,尽管不会比一个很长的lambda捕获列表更糟糕。

除了使用lambda(您已经拒绝了它),您还可以在自己的编译单元中实现您的函数,并在该编译单元中的中编写支持函数


但是支持函数将在类之外,因此您必须传递它所需的所有参数。这可能会变得非常笨拙,尽管不会比一个很长的lambda捕获列表更糟糕。

您可以使用函数对象。例如(即使在C++03中,您也可以编译它):

#包含//仅用于输出
福班{
int bar(){return 0;}//只有foo可以看到这一点
公众:
int运算符()(){
返回杆();
}
};
baz类{
公众:
福多福;
};
int main(){
巴扎;

std::cout您可以使用函数对象。例如(您可以编译它,即使在C++03中):

#包含//仅用于输出
福班{
int bar(){return 0;}//只有foo可以看到这一点
公众:
int运算符()(){
返回杆();
}
};
baz类{
公众:
福多福;
};
int main(){
巴扎;

cassiorenan的一种类似方法是使用静态类函数和friends。 大概是这样的:

void Boss();
class Worker {
    static void Test(){ return;}
    friend void Boss();
};
void Boss(){
    Worker::Test();
}

虽然我不知道您为什么要这样做。

cassiorenan的一种类似方法是使用静态类函数和好友。 大概是这样的:

void Boss();
class Worker {
    static void Test(){ return;}
    friend void Boss();
};
void Boss(){
    Worker::Test();
}

尽管您为什么要这样做,我不知道。

在没有lambda的函数中定义函数是可能的。只需定义一个包含所需函数的结构。这种方法并不比使用lambda好多少,但至少这很简单,并且也适用于较旧的编译器

int func() {

    struct {

        int hiddenFunc() {
            return 1;
         }
    } h;

    int a = h.hiddenFunc() + h.hiddenFunc();

    return a;
}

在没有lambda的函数中定义函数是可能的。只需定义一个包含所需函数的结构。这种方法并不比使用lambda好多少,但至少这很简单,并且也适用于较旧的编译器

int func() {

    struct {

        int hiddenFunc() {
            return 1;
         }
    } h;

    int a = h.hiddenFunc() + h.hiddenFunc();

    return a;
}

与cassiorenan的解决方案略有不同,您可以使用一个包含一个公共静态函数(可见函数)和一个只能从那里调用的静态私有函数的类。为了避免创建该类的对象,只需放置一个私有构造函数即可

编辑:

根据cassiorenan的评论,我可以看出OP确实需要方法而不是函数。在这种情况下,我仍然会在匿名命名空间中使用专用类,以确保它在其他地方不可见(即使我的示例是单文件…)在下面的例子中,bar是一个业务类,它将有一个带有外部隐藏实现的方法(这里是relay_方法),而foo专用于使用指向真实对象的指针调用的隐藏方法。在现实世界中,整个匿名命名空间和隐藏方法的实现应该在实现文件
bar.cpp

这样,真正的实现函数
priv_func
只能通过
bar::relay_method()
foo::bar_func(bar&)
从bar对象调用

#包括
分类栏;
名称空间{
福班{
私人:
静态int priv_func(int i){
返回i*i;
}
foo(){}
公众:
//只有在需要真正的函数时才有用
/*静态int pub_func(int i,int j){
返回priv_func(i)+priv_func(j);
}*/
静态空杆函数(杆和b);
};
}
分类栏{
int x;
int-x2;
公众:
bar(int i):x(i){}
无效中继_方法(){
foo::bar_func(*this);
}
朋友班富;
int getX2()常量{
返回x2;
}
};
void foo::bar_func(酒吧和早餐){
b、 x2=foo::priv_func(b.x);
}
使用名称空间std;
int main(){
/*inti=foo::pub_func(3,4);

cout与cassiorenan的解决方案略有不同,您可以使用一个包含一个公共静态函数(可见函数)和一个只能从那里调用的静态私有函数的类。为了避免创建该类的对象,只需放置一个私有构造函数即可

编辑:

根据cassiorenan的评论,我可以看出OP确实需要方法而不是函数。在这种情况下,我仍然会在匿名命名空间中使用专用类,以确保它在其他地方不可见(即使我的示例是单文件…)在下面的例子中,bar是一个业务类,它将有一个带有外部隐藏实现的方法(这里是relay_方法),而foo专用于使用指向真实对象的指针调用的隐藏方法。在现实世界中,整个匿名命名空间和隐藏方法的实现应该在实现文件
bar.cpp

这样,真正的实现函数
priv_func
只能通过
bar::relay_method()
foo::bar_func(bar&)
从bar对象调用

#包括
分类栏;
名称空间{
福班{
私人:
静态int priv_func(int i){
返回i*i;
}
foo(){}
公众:
//只有在需要真正的函数时才有用
/*静态int pub_func(int i,int j){
返回priv_func(i)+priv_func(j);
}*/
静态空杆函数(杆和b);
};
}
分类栏{
int x;
int-x2;
公众:
条(整数i):x(