繁体   English   中英

大型OOP项目中的C ++ main()

[英]C++ main() in a large OOP project

这可能是一个简短而简单的问题,但我从来没有找到一个令人满意的答案:

main()函数通常在大型C ++项目中包含哪些代码? 认为它通常只是初始化一个(包装)类对象并在其中调用一个函数来设置它是不正确的假设?

为什么main()不是第一个方法? 它是否保持与C的向后兼容性?

在我的代码中,它基本上是构造函数调用,可能是方法调用,以及一些异常处理。 这是我的项目的主要内容(标题和注释被省略,并且格式化由SO乱码,像往常一样):

int main( int argc, char * argv[] ) {
    int result = 0;
    try {
        CLIHandler ch( argc, argv );
        result = ch.ExecCommand();
    }
    catch( const Exception & ex ) {
        result = ExceptionHandler::HandleMyError( ex );
    }
    catch( const std::exception & ex ) {
        result = ExceptionHandler::HandleOtherError( ex );
    }
    catch( ... ) {
        result = ExceptionHandler::HandleUnknownError();
    }
    return result;
}

通常我的

  • 命令行解析
  • 初始化顶级对象
  • 异常处理
  • 进入主'exec'循环

据我了解, int main(int argc, char *argv[])本质上是一个由C传承的约定。 从来没有让我觉得奇怪,而是有用。 毕竟C ++扩展了C ...(是的,但是有很好的区别,但这不是问题)。

是的,原因是向后兼容。 main是C程序中允许生成可执行文件的唯一入口点,因此也是C ++程序中的唯一入口点。

至于在C ++主要做什么,它取决于。 一般来说,我曾经:

  • 执行全局初始化(例如,记录子系统)
  • 解析命令行参数并定义包含它们的适当类
  • 分配应用程序对象,设置它等。
  • 运行应用程序对象(在我的例子中,是一个无限循环方法.GUI编程)
  • 在对象完成其任务后执行完成。

哦,我忘记了应用程序中最重要的部分

  • 显示闪屏

简短的回答:这取决于。 它可能会在程序持续时间内创建一些本地对象,配置它们,相互告诉它们并在其中一个上调用长时间运行的方法。

程序需要一个入口点。 如果main必须是一个对象的方法,它应该是什么类类型?

使用main作为全局入口点,它可以选择要设置的内容。

我的main()函数经常构造各种顶级对象,为它们提供彼此的引用。 这有助于最小化耦合,保持不同顶级对象之间的确切关系局限于主要。

这些顶级对象通常具有不同的生命周期,使用init(),stop()和start()方法。 main()函数管理使对象进入所需的运行状态,等待任何指示是时候关闭,然后以受控方式关闭所有内容。 同样,这有助于保持正确的解耦,并将顶级生命周期管理保持在一个易于理解的位置。 我在反应系统中看到了很多这种模式,特别是那些有很多线程的模式。

通过在高级链接器选项下选择项目设置中的入口点,可以使用静态类成员函数代替MSVC ++编译器的main。

这真的取决于你的项目你想要放在那里...如果它很小你也可以把消息循环,初始化和关机代码放在那里。 在较大的项目中,您必须将它们移动到自己的类/函数中,或者更少具有单一的入口点函数。

并非所有C ++应用程序都是OOP,无论哪种方式,所有代码都需要一些入口点才能开始。

当我编写OOP代码时,我的main()倾向于包含一个对象实例化,可能由一些用户输入继续。 我是这样做的,因为我觉得“工作”意味着要在一个对象中完成,否则代码不会写在OOP的“精神”中。

实际上大型项目往往不包含单个程序。 因此会有几个可执行文件,每个可执行文件都有自己的main。 顺便说一句,这些可执行文件通过队列异步通信是很常见的。

是的,每个主要确实往往非常小,初始化框架或其他什么。

你的意思是为什么main()是一个函数而不是一个类的方法? 嗯,这是一个什么类的方法? 我认为这主要是来自C的C ++遗产,但......一切都要从某处开始:-)

我通常使用main在命令行中读取,初始化全局变量,然后调用适当的函数/方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM