我怎样才能创建一个只能被调用它的函数看到的函数?
定义我想要隐藏的函数,因为私有函数是不够的,因为它仍然可以被类中的其他公共函数看到。
现在我使用lambda表达式来定义函数内部的匿名函数。有没有更好的解决方案?
答案 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;
}