C ++ main () в большом ООП-проекте - PullRequest
15 голосов
/ 01 августа 2009

Это может быть короткий и простой вопрос, но я так и не нашел удовлетворительного ответа на него:

Из какого кода обычно состоит функция main () в большом проекте C ++? Было бы неправильным предположением думать, что это обычно просто инициализация (обтекание) объекта класса и вызов функции внутри него, чтобы отключить вещи?

Почему main () не метод в первую очередь? Чтобы сохранить обратную совместимость с C?

Ответы [ 9 ]

10 голосов
/ 01 августа 2009

В моем коде это в основном вызов конструктора, возможно вызов метода и некоторая обработка исключений. Это главное для моих собственных проектов (заголовки и комментарии опущены, а форматирование испорчено 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;
}
2 голосов
/ 01 августа 2009

Да, причина в обратной совместимости. main - единственная точка входа, разрешенная в программе C, создающей исполняемые файлы, и, следовательно, в программе C ++.

Что касается того, что делать в C ++ main, это зависит. В общем, я привык:

  • выполнить глобальную инициализацию (например, подсистемы ведения журнала)
  • анализирует аргументы командной строки и определяет правильный класс, содержащий их
  • выделить объект приложения, настроить его и т. Д.
  • запустить объект приложения (в моем случае, метод бесконечного цикла. Программирование GUI)
  • выполнить финализацию после того, как объект завершил свою задачу.

о, и я забыл самую важную часть приложения

  • показать заставку
2 голосов
/ 01 августа 2009

Шахта обычно делают

  • Разбор командной строки
  • Инициализация объектов верхнего уровня
  • Обработка исключений
  • вход в основной цикл 'exec'

Насколько я понимаю, int main(int argc, char *argv[]) по сути является соглашением из-за наследия C. Никогда не казался мне странным, а скорее полезным. C ++ расширяет C в конце концов ... (и да, есть отличная разница, но это не был вопрос здесь).

1 голос
/ 02 августа 2009

Моя функция main () часто создает различные объекты верхнего уровня, давая им ссылки друг на друга. Это помогает минимизировать связь, сохраняя точные отношения между различными объектами верхнего уровня, ограниченными основным.

Часто эти объекты верхнего уровня имеют разные жизненные циклы с методами init (), stop () и start (). Функция main () управляет переводом объектов в желаемое состояние работы, ожидает того, что покажет время для выключения, а затем выключает все контролируемым образом. Опять же, это помогает должным образом отделить вещи и обеспечивает управление жизненным циклом на высшем уровне в одном легко понятном месте. Я часто вижу эту схему в реактивных системах, особенно в тех, у которых много потоков.

1 голос
/ 01 августа 2009

Краткий ответ: это зависит. Он вполне может создать несколько локальных объектов, которые необходимы на время работы программы, настроить их, рассказать им друг о друге и вызвать долгосрочный метод для одного из них.

Программа нуждается в точке входа. Если main должен быть методом объекта, то каким должен быть тип класса?

С main в качестве глобальной точки входа можно выбрать, что настраивать.

0 голосов
/ 01 августа 2009

Обычно я использую main для чтения в командной строке, инициализации глобальных переменных и последующего вызова соответствующих функций / методов.

0 голосов
/ 01 августа 2009

Действительно крупные проекты, как правило, не включают в себя только одну программу. Следовательно, будет несколько исполняемых файлов, каждый со своим собственным main. Попутно, эти исполняемые файлы довольно часто взаимодействуют асинхронно через очереди.

Да, каждая основная часть имеет тенденцию быть очень маленькой, инициализируя структуру или что-то еще.

Вы имеете в виду, почему main () является функцией, а не методом класса? Ну, какой класс это будет метод? Я думаю, что это в основном наследие C ++ от C, но ... все должно где-то начинаться :-)

0 голосов
/ 01 августа 2009

Не все приложения на C ++ являются ООП, и в любом случае для всего кода требуется некоторая точка входа для запуска.

Когда я пишу код ООП, мой main() имеет тенденцию включать создание экземпляров объекта, возможно, после некоторого пользовательского ввода. Я делаю это так, потому что чувствую, что «работа» предназначена для выполнения внутри объекта, иначе код не написан в «духе» ООП.

0 голосов
/ 01 августа 2009

Вы можете использовать статическую функцию-член класса вместо main в компиляторе MSVC ++, выбрав точку входа в настройках проекта в дополнительных параметрах компоновщика.

Это действительно зависит от вашего проекта от того, что вы хотите поместить туда ... если он маленький, вы можете также поместить туда циклы сообщений, код инициализации и завершения работы. В более крупных проектах вам придется перемещать их в свои собственные классы / функции, или же они имеют монолитную функцию точки входа.

...