2009-08-01 3 views
16

이 짧은 & 간단한 질문 할 수있다,하지만 난 그것에 만족스러운 답을 찾을 적이 :C++ 큰 OOP에서()의 주요 프로젝트

주() 함수는 일반적으로 구성 않는 어떤 코드를 대형 C++ 프로젝트? 일반적으로 (래핑) 클래스 객체를 초기화하고 내부의 함수를 호출하여 객체를 설정한다고 생각하는 것은 잘못된 가정일까요?

main()이 처음에는 메서드가 아닌 이유는 무엇입니까? C와의 하위 호환을 유지합니까?

+1

멤버 함수가 아닌 이유는 클래스의 멤버 함수를 지정하는 방법이 필요하기 때문입니다. C++은 Java의 매니페스트와 같은 것이 아니며 리플렉션이 없습니다. –

+0

보다 개념적인 수준에서, 모든 프로그램은 진입 점이 필요합니다. "고전적인"C++의 경우 컴파일러가 생성 한 실행 파일 내에 있습니다. 프로그램이 시작될 때 main이 메소드가 될 수있는 클래스가 없습니다. 인터프리터 언어에서는 런타임이 먼저 실행되고 응용 프로그램이 시작할 때까지 실행되도록 컨텍스트를 설정하므로 언어 ​​/ 런타임이 허용하거나 허용해야하는 이전 설치 클래스의 메소드/멤버가되는 진입 점이 가능합니다. – Mark

+2

@ 마크 : 무엇? 컴파일러는 main()이 실행되기 전에 클래스의 정적 멤버를 비롯하여 다양한 것들을 초기화하는 코드를 생성합니다. C++에서 런타임에 클래스가 존재한다고 말할 수있는 정도까지는 엔트리 포인트가 호출되기 전에 많은 클래스가 존재합니다. 존재하는 대상도 많이있을 수 있습니다. –

답변

10

제 코드에서 볼 수있는 것은 기본적으로 생성자 호출, 메소드 호출 및 예외 처리입니다. 이것은 (헤더와 코멘트 평소와 같이 생략하고, 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; 
} 
+0

'result ='를'return'으로 바꾸지 않는 이유는 무엇입니까? – GManNickG

+2

입 닦아 라! 모든 잘 구조화 된 코드에서 하나의 종료 점만 가져야한다는 요구 사항을 들어 본 적이 없습니까? 그러나 심각하기 때문에 검사 ​​할 변수가 있으므로 내 방식을 디버그하기가 더 쉽습니다. –

+0

아, 롤 보입니다. 너는 나를 놀래 켰다. 나는 마치 "FUUU- 무엇?!". 나는 반환 변수를 검사 할 필요가 없었던 것 같아요, 내 오류 처리기는 예외와 함께 그것을 출력합니다. 그렇지 않으면 코드가 동일합니다. – GManNickG

1

짧은 대답은 다릅니다. 프로그램 기간 동안 필요한 몇 가지 로컬 객체를 만들고, 구성하고, 서로에 대해 이야기하고, 그 중 하나에서 장기 실행 메서드를 호출 할 수 있습니다.

프로그램에 진입 점이 필요합니다. main이 객체의 메소드 여야한다면, 어떤 클래스 유형이어야 하는가?

main으로 글로벌 진입 점으로 설정할 항목을 선택할 수 있습니다.

2

광산 일반적으로 최상위의

  • 초기화를 구문 분석 명령 줄 내가 알고있는 것처럼
  • 처리 예외
  • 메인 '간부'루프
  • 를 입력 객체

    • 할 , int main(int argc, char *argv[])은 본질적으로 C 유산 때문에 대회입니다. 이상하게 들리지는 않았지만 오히려 유용했습니다. C++은 결국 C를 확장합니다 ... (그렇습니다. 좋은 차이점이 있습니다 만, 여기에는 질문이 없습니다).

    2

    예, 이유는 이전 버전과의 호환성입니다. main은 실행 파일을 생성하는 C 프로그램에서 허용되는 유일한 진입 점이며, 따라서 C++ 프로그램에서 허용됩니다.

    C++ 메인에서 수행 할 작업은 다릅니다. 등을 설정,

    • 구문 분석 명령 줄 인수 (예 : 로깅 하위 시스템의) 글로벌 초기화를 수행하고
    • 응용 프로그램 객체를 할당 그들에게이 포함 된 적절한 클래스를 정의 : 일반적으로, 나는하려면 사용
    • 응용 프로그램 개체를 실행하십시오 (제 경우에는 무한 루프 메서드, GUI 프로그래밍)
    • 개체가 작업을 완료 한 후에 마무리 작업을 수행하십시오.

    오 내가 응용 프로그램

    • 의 가장 중요한 부분을 잊었다는되는 SplashScreen
    0

    당신은 선택하여 MSVC++ 컴파일러의 주요 대신에 정적 클래스 멤버 함수를 사용할 수 있습니다 보여 고급 링커 옵션에서 프로젝트 설정의 진입 점.

    정말로 프로젝트에 따라 달라집니다. 작은 경우 메시지 루프, 초기화 및 시스템 종료 코드를 넣을 수 있습니다. 더 큰 프로젝트에서는 이것을 자신의 클래스/함수로 옮겨야하거나 모 놀리 식 진입 점 기능을 갖지 않을 것입니다.

    0

    모든 C++ 응용 프로그램이 OOP가 아니며 모든 코드가 시작하려면 일부 코드가 필요합니다.

    OOP 코드를 작성할 때 내 main()은 개체 인스턴스화를 포함하는 경향이 있습니다. 사용자 입력에 의해 진행될 수 있습니다. 나는 '작업'이 객체 내에서 수행되도록 의도되어 있다고 생각하기 때문에 이런 식으로 처리합니다. 그렇지 않으면 코드가 OOP의 '정신'에 쓰여지지 않습니다.

    0

    매우 큰 프로젝트는 단일 프로그램으로 구성되지 않는 경향이 있습니다. 따라서 각각 실행 파일이 여러 개있을 것입니다. 이 실행 파일은 대기열을 통해 비동기 적으로 통신하는 것이 일반적입니다.

    예 각각의 메인은 프레임 워크 또는 기타를 초기화하는 매우 작은 경향이 있습니다.

    main()이 클래스가 아닌 함수 인 이유는 무엇입니까? 글쎄, 어떤 계급이 방법 일까? C에서 대부분 C++의 유산이라고 생각하지만 ... 모든 것이 어딘가에서 시작해야합니다 :-)

    +1

    main은 함수가 아니라 메서드입니다 ... – micmoo

    +0

    고마워, 네 말이 맞아. – djna

    0

    나는 보통 다음 전역 변수를 초기화, 명령 줄에서 읽기위한 주요 사용하고, 적절한 함수/메소드 호출.

    1

    main() 함수는 종종 다양한 최상위 객체를 구성하여 서로에 대한 참조를 제공합니다. 이렇게하면 커플 링을 최소화하고 메인에 한정된 여러 최상위 오브젝트 간의 정확한 관계를 유지할 수 있습니다.

    종종 이러한 최상위 레벨 객체에는 init(), stop() 및 start() 메소드가있는 고유 한 라이프 사이클이 있습니다. main() 함수는 객체를 원하는 실행 상태로 가져와 종료 할 때까지 기다린 다음 제어 된 방식으로 모든 것을 종료합니다. 다시 말하지만, 이것은 일을 적절히 분리시키고, 가장 쉽게 이해할 수있는 장소에서 최상위 라이프 사이클 관리를 유지하는 데 도움이됩니다. 나는이 패턴을 반응성 시스템, 특히 스레드가 많은 시스템에서 많이 봅니다.