이것은 실제 질문이 아닐 수도 있습니다. 적절하지 않은 경우 이것을 닫으십시오.Java 방식으로 C++ 클래스를 정의하십시오.
C++에서, 당신은이 a.cc
및 b.cc
으로 포함되어있어 예를 들어, 클래스가 두 번 정의되는, 하나의 소스 파일에 헤더와 구현을 혼합 할 수 없습니다 : 그런 다음
// foo.h
#pragma once
class Foo {
void bar() { ... }
};
// a.cc
#include "foo.h"
class A {};
// b.cc
#include "foo.h"
class B {};
// Link all
$ gcc -c -o a.o a.cc
$ gcc -c -o b.o b.cc
$ gcc -o main main.cc foo.o a.o b.o
, 그것은 모호한 Foo :: bar() 세 개의 오브젝트 파일!
대신, 우리는 다른 파일에 구현을 분리해야합니다
// foo.h
#pragma once
class Foo {
void bar();
};
// foo.cc
# include "foo.h"
void Foo::bar() { ... }
아마 큰 문제가 있지만, 일반적으로 a.o
및 b.o
에서 foo는 : 바()에 대한 바이너리가 동일하기 때문이다. 적어도 중복 된 선언이있는 것 아닌가요? 그리고이 중복에 의해 야기 된 몇 가지 혼란 :
선택적 매개 변수에 대한 기본값은 어디에 있습니까?
class Foo { void bar(int x = 100); };
또는
void Foo::bar(int x = 100) { ... }
또는 두
?인라인 간 이동 & 인라인 ... 아닌가요?
인라인되지 않은 함수를 인라인 함수로 전환하려면
foo.cc
에서foo.h
으로 코드를 이동하고inline
키워드 접두어를 추가해야합니다. 그리고 아마도 2 초 후, 당신은 당신이 한 일을 후회하게됩니다. 그 다음,foo.h
에있는 인라인 된 단어를 다시foo.cc
으로 옮기고inline
키워드를 다시 제거하십시오.그러나 선언과 정의가 함께 사용되는 경우에는 그렇게하지 않아도됩니다.
그리고 이런 종류의 사소한 두통이 있습니다.
당신이 선언과 함께 함수의 정의를 작성하면 컴파일러가 함수의 프로토 타입을 유추 할 수 없다는 생각이 들게됩니다.
예를 들어, 예를 들어, 단지
#include_typedef "source.cc"
것들의 형식 정보를 하나의 source.cc
을 사용하고 가져가 간단 할 것입니다. 컴파일러가 AST를 구성하기 전에 파서 시간에 필터 만 사용하여 변수 할당 및 함수 정의를 무시하는 것이 쉽지 않은가요?
필자는 별도의 소스/헤더 파일로 프로그래밍하는 데 익숙하지만 필자는 분리를 확실히 할 수 있습니다. 프로그래밍 스타일에 대해 논할 수는 있지만 논리가 더 나은 프로그래밍 스타일로 표현되는 올바른 방법이 무엇인지에 대한 질문을 저하시킵니다. 소스/헤더 분리 컨텍스트에서 Java가 더 나은 프로그래밍 스타일이라고 생각하지 않습니다. 하지만 자바는 올바른 방법을 제공합니다.
헤더와 클래스를 분리 하시겠습니까? 가능하면 어떻게 하나로 섞을 것입니까? 선언과 정의를 혼합 된 소스에서 별도의 파일로 분리 할 수있는 C++ 프런트 엔드가 있습니까? 또는 어떻게 그런 글을 쓸 수 있습니까? (필자는 GCC를 의미한다.)
편집
내가 C를 강타하고 있지 않다 당신은이 질문에서 잘못된 정보를 얻는 경우 ++ 어쨌든, 미안 해요.
C++은 다중 패러다임 언어이므로 매직 매크로를 사용하여 MFC 설정 메시지 바인딩을 이해하고 템플릿을 사용하여 라이브러리가 모든 것을 구현하는 방법을 확인할 수 있습니다. 분리가 문제 영역으로 들어가면 (도메인이 패키징 시스템에 속해 있음을 알리는 ONeal에게 감사) 문제를 해결하는 방법을 찾아 낼 수 있습니다. 프로그래밍 스타일에는 많은 종류가 있습니다. C++ 프로그래밍에 많은 시간을 썼기 때문에, 어떤 작은 편의도 큰 편리함으로 축적됩니다. 선언과 함께 구현을 작성하는 것이 편리합니다. 나는 그들을 분리 할 필요가 없으면 적어도 10 %까지 소스 라인을 줄일 수 있다고 생각한다. 편리하다면 자바를 사용하는 것이 왜 중요할까요? C++이 Java와 다르다는 것은 분명합니다. 상호 교환 할 수 없습니다.
인라인 함수는 문제를 해결할 수 있지만 의미를 전혀 변경하지 않습니다.
그렇다면 [C++ book] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)에서 배우고 계신가요? 문제를 잘못 진단했습니다. * 헤더 가드 *가 필요합니다. (그리고 선언문에서 기본값을 지정하십시오. 그래서 첫 번째 문장을 지정하십시오.) 이러한 질문은 C++ 책에 의해 응답되어야합니다. – GManNickG
'foo.h'에 포함 된 가드가 없기 때문에'Foo 클래스의 재 선언 '을 얻은 이유가 있습니다. '.h' 파일에 구현체를 포함시키는 것과 아무런 관계가 없습니다. –
그리고'.c' 파일에 C++ 코드를 제공하면 컴파일러가 잘못된 것을하도록 요청하는 것입니다. – jalf