2008-10-03 3 views
4

멤버 함수가 클래스의 내부와 외부에 모두 프로그래밍되었고 클래스 내부에 함수 프로토 타입이 있습니다. 첫 번째 방법을 사용하여 프로그래밍 한 적이 있지만 다른 선호도를 사용하는 것이 더 나은지 궁금해하십니까? 당신은 C++을 의미 가정멤버 함수를 프로그래밍 할 때 더 좋은 방법은 무엇입니까?

+0

당신은 말하지 않았지만이 C++입니까? –

+0

어떤 언어입니까? C++? –

답변

6

, 당신이 클래스 안에 넣어 경우, 컴파일러는 항상 바람직하지 않은, 그것을 인라인 시도 할 수 있기 때문에, 클래스의 외부 기능을 를 정의하는 것이 더 낫다 :

  1. 코드 크기가 증가합니다 (이 헤더를 포함하는 모든 객체 파일은 해당 코드의 함수 사본으로 끝날 수 있음).
  2. 함수 정의가 변경 될 때 바이너리 호환성이 깨어납니다.

심지어 인라인 기능, 그것은 일반적으로 더 나은 기능은 사소한 접근 또는 다른 한 줄이 아닌, 클래스 공용 인터페이스의 가독성을 개선하기 위해 클래스 외부 정의를 넣어하는 것입니다.

+0

클래스 내에 멤버 함수가 구현되어 있는지 여부는 컴파일러가 인라인하려고 시도하는지 여부와 관련이 없습니다. –

+0

죄송합니다, 이것은 올바르지 않습니다 : http://www.parashift.com/c++-faq-lite/inline-functions.html#faq-9.8 –

+0

나 자신을 바로 잡아야합니다. 자동으로 인라인 멤버가 내부적으로 구현 된 컴파일러가있을 수 있습니다. 클래스 정의. 그러나이 동작은 compiler-specicif이며 모든 C++ 컴파일러에서 true로 간주 할 수 없습니다. –

2

두 기술 모두 장점이 있습니다.

프로토 타입 만 클래스 정의에 배치하면 클래스를 사용하는 사람이 어떤 방법을 사용할 수 있는지 쉽게 알 수 있습니다. 구현 세부 사항에주의를 기울이지 않습니다.

코드를 클래스 정의에 직접 넣으면 클래스를 사용하는 것이 더 간단 해지고 # 헤더 만 포함하면됩니다. 이것은 템플릿 기반 클래스에서 특히 유용합니다 (필수).

+0

구현 세부 사항은이 부분의 큰 부분을 차지합니다. –

2

언어를 추정하는 것은 C++입니다 :

결론은 개인적인 취향입니다. 수업 내에서는 전반적으로 짧고 특히 더 구체적입니다. 특히

유형의 기능입니다. 외부 클래스는 클래스 정의에서 "클러 터"를 제거 할 수 있습니다.

내가 모두 사용 ... 물론

이 아닌 인라인 함수는 클래스 외부 항상 보았다.

1

나는 C++에 대해 이야기하고 있다고 가정합니다.

멋지고 깨끗한 인터페이스를 갖는 것이 좋습니다. 별도의 구현 파일을 사용하면 인터페이스를 깨끗하게 유지하는 데 도움이됩니다.

특히 컴파일 시간이 단축됩니다 (특히 opaque pointer을 사용하는 경우).

2

클래스를 정의 할 때 두 스타일을 혼합하는 것이 일반적입니다. 1 또는 2 행으로 구성된 간단한 메소드의 경우 클래스 정의 내에서 메소드 본문을 정의하는 것이 일반적이며 편리합니다. 좀 더 긴 메소드의 경우 외부 적으로 정의하는 것이 좋습니다. 메소드 몸체를 어지럽히 지 않고보다 읽기 쉬운 클래스 정의를 갖게 될 것이다.

메소드의 구현을 숨기는 것은 클래스의 사용자가 실제 구현에 방해되지 않도록하거나 나중에 변경 될 수있는 구현에 대한 가정을하는 데 유용합니다.

1

클래스 내에 함수를 구현하면 클래스를 여러 .cpp 파일에 # 포함 할 수 없거나 링커에서 여러 함수 정의에 대해 불만을 토로합니다.

따라서 일반적으로 .h 파일의 클래스 정의와 .cpp 파일의 멤버 구현 (대개 같은 이름)을 사용하는 것이 일반적입니다.

4

C++의 경우 메서드 정의를 헤더 파일에 두는 것은 헤더가 변경 될 때 주어진 헤더가 포함 된 모든 내용을 다시 컴파일해야 함을 의미합니다.

헤더에서 정의를 이동하면 헤더 자체가 변경 될 때 (함수 추가/제거 또는 선언 변경)에만 헤더를 포함하는 파일을 다시 컴파일해야합니다. 이것은 복잡한 프로젝트의 컴파일 시간에 큰 영향을 줄 수 있습니다.

1

다시 말하지만, 저는 이것을 보통 가상 함수의 자리 표시 자로 제한합니다.

virtual int MyFunc() {} // Does nothing in base class, override if needed 

Andrew Medico의 요점은 너무 쉽게 시작되어 컴파일 시간이 아플 수 있습니다.

관련 문제