如何使一个函数只能在c ++中看到一个函数?

时间:2015-01-09 12:38:01

标签: c++

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

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

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

5 个答案:

答案 0 :(得分:7)

除了使用lambda(你已经拒绝了)之外,你可以在自己的编译单元中实现你的函数,并在 {{3}中编码支持函数} 在该编译单元内。

但是这个支持功能将在课外,所以你必须传递它所需的所有参数。这可能会变得笨拙,但并不比一个长长的lambda捕获列表更糟糕。

答案 1 :(得分:1)

您可以使用功能对象。例如(你可以编译它,即使在C ++ 03中):

#include <iostream> // only for output

class foo{
  int bar(){return 0;} // Only foo can see this
  public:
  int operator()(){
    return bar();
  }
};

class baz{
  public:
  foo do_foo;
};

int main(){
  baz a;
  std::cout << a.do_foo() << std::endl;
}

方法栏只能由foo看到。 P.S。:如果你需要foo访问baz的成员,请把它变成朋友。

答案 2 :(得分:0)

与cassiorenan类似的方法是使用静态类函数和朋友。 像这样:

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

虽然你为什么要这样做,但我不知道。

答案 3 :(得分:0)

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

int func() {

    struct {

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

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

    return a;
}

答案 4 :(得分:-1)

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

编辑:

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

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

#include <iostream>

class bar;
namespace {
class foo {
private:
    static int priv_func(int i) {
        return i * i;
    }
    foo() {}
public:
    // only useful if true functions were needed
    /* static int pub_func(int i, int j) {
        return priv_func(i) + priv_func(j);
    }*/
    static void bar_func(bar& b);
};
}
class bar {
    int x;
    int x2;
public:
    bar(int i): x(i) {}
    void relay_method() {
        foo::bar_func(*this);
    }
    friend class foo;
    int getX2() const {
        return x2;
    }
};

void foo::bar_func(bar& b) {
    b.x2 = foo::priv_func(b.x);

}

using namespace std;

int main() {
    /* int i = foo::pub_func(3,4);
    cout << i << endl;
    // foo::priv_func(2); error access to private member of class foo
    // foo f; */

    bar b(2);
    b.relay_method();
    cout << b.getX2() << endl;
    return 0;
}