假设我们有类似的类函数:
class foo {
// Private data needs to be accessed by bar
public:
static int bar();
};
int main(int argc, char** argv) {
// Want to write bar() instead of foo::bar()
bar();
}
using
似乎无法将类成员导入全局范围,如果bar
成为全局函数,则无法访问私有数据。是否可以通过非限定名称在全局范围内访问bar
?
答案 0 :(得分:4)
int bar()
{
return foo::bar();
}
答案 1 :(得分:2)
您必须在某处编写foo::bar
,但可以将其隐藏在函数中。
int bar()
{ return foo::bar(); }
int main(int argc, char** argv) {
// Want to write bar() instead of foo::bar()
bar();
}
答案 2 :(得分:1)
class foo {
int i;
// Private data needs to be accessed by bar
public:
friend int bar(foo);
};
int bar(foo f) {
return f.i = 3;
}
int main(int argc, char** argv) {
foo g;
// Want to write bar() instead of foo::bar()
bar(g);
}
答案 3 :(得分:0)
将foo
中的静态内容考虑在内,因为它无论如何都不属于某个类。类和命名空间之间唯一的功能区别是您可以实例化一个类。既然你显然不需要它(因为你正在使用静态成员函数),你也可以将foo
更改为:
namespace foo {
class fooData { // optional, if you must hide the private data
friend int bar();
// Private data needs to be accessed by bar
};
int bar();
};
using foo::bar;
答案 4 :(得分:0)
正如其他人所说,存根全局功能。或宏:
#define bar foo::bar
没有真正的方法可以导入命名空间,例如C#using
。