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

C++ C++;大型OOP项目中的main(),c++,oop,main,C++,Oop,Main,这可能是一个简短的问题,但我从未找到令人满意的答案: 在一个大型C++项目中,主()函数通常包含哪些代码?认为它通常只是初始化(包装)一个类对象并调用其中的函数来启动它是一种错误的假设吗 为什么main()首先不是一个方法?它是为了保持与C的向后兼容性吗?简单的回答是:这取决于。它可能会创建一些在程序运行期间需要的本地对象,对它们进行配置,告诉它们彼此的情况,并对其中一个对象调用长时间运行的方法 程序需要一个入口点。如果main必须是对象上的方法,那么它应该是什么类类型 使用main作为全局入口

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

在一个大型C++项目中,主()函数通常包含哪些代码?认为它通常只是初始化(包装)一个类对象并调用其中的函数来启动它是一种错误的假设吗


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

简单的回答是:这取决于。它可能会创建一些在程序运行期间需要的本地对象,对它们进行配置,告诉它们彼此的情况,并对其中一个对象调用长时间运行的方法

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

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

我的通常是这样做的

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

据我所知,
intmain(intargc,char*argv[])
本质上是一种惯例,因为
C
的传统。我从来没有觉得奇怪,而是觉得有用。C++扩展C之后…(是的,有细微的区别,但这不是问题所在)

是的,原因是向后兼容。主是允许生成可执行程序的C程序中允许的唯一入口点,因此在C++程序中是允许的。 <关于C++主要做什么,它取决于。一般来说,我曾经:

  • 执行全局初始化(例如日志子系统的初始化)
  • 解析命令行参数并定义包含它们的适当类
  • 分配应用程序对象、设置应用程序对象等
  • 运行应用程序对象(在我的例子中,是一个无限循环方法.GUI编程)
  • 在对象完成其任务后执行终结
哦,我忘了申请表中最重要的部分

  • 显示屏幕

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


这真的取决于你的项目,你想在那里放置什么。。。如果它很小,您也可以将消息循环、初始化和关闭代码放在其中。在较大的项目中,您必须将这些类移动到它们自己的类/函数中,或者更少地具有整体入口点函数。

< P>不是所有C++应用程序都是OOP,并且无论哪种方式,所有代码都需要从某个入口点开始。p>
当我编写OOP代码时,我的
main()
倾向于包含一个对象实例化,可能由一些用户输入进行。我这样做是因为我觉得“工作”是在一个对象内完成的,否则代码就不是按照OOP的“精神”编写的。

真正的大型项目往往不仅仅包含一个程序。因此,将有几个可执行文件,每个文件都有自己的主文件。顺便说一下,这些可执行文件通过队列异步通信是很常见的

是的,每个main都很小,初始化了一个框架或者其他什么


你的意思是为什么main()是函数而不是类的方法?那么,这是一种什么样的教学方法呢?我认为这主要是C++从C继承下来的,但是。。。在我的代码中,它基本上是一个构造函数调用,可能是一个方法调用,以及一些异常处理。这是我自己的项目的主要原因(标题和注释被省略,格式被SO弄乱,像往常一样):


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

My main()函数通常构造各种顶级对象,使它们相互引用。这有助于最小化耦合,使不同顶级对象之间的精确关系仅限于主对象


通常,这些顶级对象具有不同的生命周期,包括init()、stop()和start()方法。函数的作用是:使对象进入所需的运行状态,等待任何指示关闭时间的信息,然后以可控的方式关闭所有内容。同样,这有助于将事情适当地解耦,并将顶级生命周期管理保持在一个容易理解的地方。我在反应式系统中经常看到这种模式,尤其是那些有很多线程的系统。

它不是成员函数的原因是,您需要一种方法来指定它是哪个类的成员函数。C++没有java的清单,也没有反射。从更概念的层面上讲,每个程序都需要一个入口点,在“C++”的情况下,这是在编译器产生的可执行程序内,当程序启动时,没有任何一个类可以是一个方法。在解释语言中,运行时首先执行,并在应用程序启动之前为其设置一个要运行的上下文,因此,如果语言/运行时允许/需要,则可以将入口点设置为某个以前设置的类的方法/成员。@Mark:什么?编译器负责在main()执行之前发出代码来初始化各种内容,包括类的静态成员。在C++中运行类可以说类存在的范围内,在调用入口点之前存在大量的类。甚至还有很多对象存在。“OnByOne”标准编译器(C++)发出代码来初始化静态成员和对象,这些STDLIB或用户代码的一些实现可能会创建静态成员/类/对象,这对于问题来说是不重要的。C++没有按规范创建一个根类,它可能是一个成员。为什么不只是用<代码>返回<代码>来替换所有的<代码>结果= < /COD>?
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;
}