0

假设我们有一个这样的类函数:

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可以通过非限定名称在全局范围内访问?

4

5 回答 5

4
int bar()
{
    return foo::bar(); 
}
于 2012-08-31T12:19:38.957 回答
2

您必须在foo::bar 某处写,但可以将其隐藏在函数中。

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

int main(int argc, char** argv) {
     // Want to write bar() instead of foo::bar()
     bar();
 } 
于 2012-08-31T12:21:04.740 回答
1

这就是friends 的用途。

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);
}
于 2012-08-31T14:39:46.710 回答
0

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

#define bar foo::bar

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

于 2012-08-31T12:33:05.043 回答
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;
于 2012-08-31T12:28:31.583 回答