Подтвердить что ты не робот

С++ main() в большом проекте ООП

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

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

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

4b9b3361

Ответ 1

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

Моя обычно делает

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

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

Ответ 3

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

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

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

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

  • показать заставку

Ответ 4

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

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

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

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

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

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

Ответ 8

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

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

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

Ответ 9

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