在C ++中将main()声明为友元函数

时间:2013-01-29 12:12:25

标签: c++

我有一个类,我只希望客户端为每个进程创建一个对象。而不是单身,更好的方法(我相信)是告诉客户只在main()中创建它们。因此,自然的执行是将构造函数private和main()作为朋友。

它的工作原理如下:

class A { friend int main(int, char**); A() {} };
int main(int, char **) { A a; }

但是当我需要将A类放在命名空间中时它会中断:

namepace ns { class A { friend int main(int, char**); A() {} }; }
int main(int, char **) { ns::A a; }

问题是范围界定:编译器现在认为

friend int main 

表示命名空间ns中名为main()的函数。所以真正的main()变得无关紧要。

所以问题是:如何解决这个问题?当然,我必须将A类放在命名空间中。

2 个答案:

答案 0 :(得分:5)

使用“::”来限定某些内容在全局命名空间中,即:

friend int ::main(int argc, char** argv);

答案 1 :(得分:5)

您需要在类定义之前在全局命名空间中声明main,因为friend声明只能在周围的命名空间中引入名称:

int main(int, char**);

并在名称空间中引用它时限定名称:

namepace ns { class A { friend int ::main(int, char**); A() {} }; }
//                                 ^^