【问题标题】:Declare main() as friend function in C++在 C++ 中将 main() 声明为友元函数
【发布时间】:2013-01-29 12:12:24
【问题描述】:

我有一个类,我只希望客户为每个进程创建一个对象。除了单例,更好的方法(我相信)是告诉客户只在 main() 中创建它们。因此,一个自然的强制措施是将构造函数设为私有,并将 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 类放在命名空间中。

【问题讨论】:

  • 使 main 成为朋友的语义与每个进程一个对象完全不同:将 main 作为朋友并不会阻止它创建多个对象。 otoh,每个进程一个对象很可能意味着该对象可以在 main() 中的其他函数中访问。那么您真正想要完成什么?你的课是关于什么的?
  • 为什么这是更好的方法?
  • 我不认为 friend 做你认为它做的事情。
  • int main(int, char **) { ns::A a, b,c,d; }

标签: c++


【解决方案1】:

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

int main(int, char**);

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

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

【讨论】:

    【解决方案2】:

    使用“::”将某物限定为在全局命名空间中,即:

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

    【讨论】:

    • 如果我想在图书馆做这件事,我该怎么做?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-07
    • 2013-11-19
    • 2017-10-11
    • 2013-03-31
    相关资源
    最近更新 更多