代码之家  ›  专栏  ›  技术社区  ›  Daniel Sloof

大型OOP项目中的C++主体()

  •  15
  • Daniel Sloof  · 技术社区  · 16 年前

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

    在大型C++项目中,主()函数通常包含哪些代码?如果认为它通常只是初始化(包装)类对象并调用它内部的函数来设置对象,这是不是一个错误的假设?

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

    9 回复  |  直到 16 年前
        1
  •  10
  •   anon    16 年前

    在我的代码中,它基本上是一个构造函数调用,可能是一个方法调用,以及一些异常处理。这是我自己的项目的主要内容(省略了标题和注释,并像往常一样将格式设置得一团糟):

    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;
    }
    
        2
  •  2
  •   Dirk is no longer here    16 年前

    矿井通常做

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

    据我所知, int main(int argc, char *argv[]) 本质上是由于 C 遗产。我从来没有觉得自己很古怪,但也很有用。C++扩展C之后…(是的,有细微差别,但这不是问题所在)。

        3
  •  2
  •   Stefano Borini    16 年前

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

    至于C++主要做什么,这要看情况而定。一般来说,我曾经:

    • 执行全局初始化(例如日志子系统的初始化)
    • 分析命令行参数并定义包含这些参数的适当类
    • 分配应用程序对象、设置应用程序对象等。
    • 运行应用程序对象(在我的例子中,是一个无限循环方法)。图形用户界面编程)
    • 在对象完成其任务后执行终结。

    噢,我忘了申请表中最重要的部分

    • 显示喷溅屏幕
        4
  •  1
  •   CB Bailey    16 年前

    简短的回答:视情况而定。它很可能会创建一些在程序运行期间需要的本地对象,对它们进行配置,相互介绍,并对其中一个对象调用长时间运行的方法。

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

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

        5
  •  1
  •   rtenhove    16 年前

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

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

        6
  •  0
  •   jheriko    16 年前

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

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

        7
  •  0
  •   Dana the Sane    16 年前

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

    当我写OOP代码时, main() 倾向于包含一个对象实例,可能由一些用户输入进行。我这样做是因为我觉得“工作”应该在一个对象内完成,否则代码就不是用OOP的“精神”来写的。

        8
  •  0
  •   Imagist    16 年前

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

        9
  •  0
  •   djna    16 年前

    真正大型的项目往往不只是一个项目。因此,将有几个可执行文件,每个都有自己的主文件。在传递过程中,这些可执行文件通常通过队列异步通信。

    是的,每个主体都很小,初始化一个框架或者其他什么东西。

    你的意思是为什么main()是一个函数而不是类的方法?那么,它是一个什么类的方法呢?我认为这主要是C++的遗产,但是…一切都要从某个地方开始:—)