通过不合格的名称引用类函数

时间:2012-08-31 12:05:17

标签: c++

假设我们有类似的类函数:

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

5 个答案:

答案 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)

That's what friends are for.

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