用非限定名称引用类函数

Referring to a class function by the unqualified name

本文关键字:引用 类函数 定名称      更新时间:2023-10-16

假设我们有一个类函数,如下所示:

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在全局范围内可访问?

int bar()
{
    return foo::bar(); 
}

您必须在的某个地方编写foo::bar,但可以将其隐藏在函数中。

int bar()
{ return foo::bar(); }
int main(int argc, char** argv) {
     // Want to write bar() instead of foo::bar()
     bar();
 } 

这就是friend的作用。

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);
}

去掉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;

正如其他人所说,存根全局函数。或者宏:

#define bar foo::bar

并没有像C#using那样真正导入到命名空间中的方法。