2009-09-14 2 views
1

내 typedef 접근법이 내 빌드에 미치는 영향에 대해 궁금합니다.전달 typedef 선언, 빌드 시간에 대한 영향 및 명명 규칙

다음 예제를 고려하십시오. 내가 위에서와 같은 상황을 끝낼 때마다

#include "SomeClass.h" 

class Foo 
{ 
    typedef SomeClass SomeOtherName; 

    SomeOtherName* storedPointer; 

    void setStoredPointer(SomeOtherName* s); 
} 

void Foo::setStoredPointer(SomeOtherName* s) 
{ 
    storedPointer = s; 
} 

이 내가 헤더 파일을 #include를 필요로하고, 따라서 헤더 파일에 형식 정의를 구동한다. 전방 선언이 없다면 빌드 시간이 길어질 수 있습니다. 이 게시물에 의견을 바탕으로

:

Forward declaration of a typedef in C++

나는 참조 또는 포인터 typedef에 클래스를 선언 전달할 수 있습니다, 다음 #INCLUDE .cpp 파일 내부. 그러면 빌드 시간이 단축됩니다. 이 결론에 대해 나는 맞습니까?

typedef SomeClass* SomeOtherNamePtr; 
typedef SomeClass& SomeOtherNameRef; 
typedef const SomeClass* SomeOtherNameConstPtr; 
typedef const SomeClass& SomeOtherNameConstRef; 

이것은 나에게 매우 깨끗한 코드처럼 보이지 않는, 나는 내가 읽은 기사/게시물을 (반드시에 대한 생각 :

그렇다면, 나는 이와 같은 타입 정의로 끝날 것 그래서) 추천하고 있습니다.

이게 맞습니까? 더 나은 대안?


업데이트

: 마이클 버의 답변을 사용 , 나는 단지 포인터와 참조의 사건을 해결 할 수 있었다. 그러나 sizeof() 함수를 사용하려고 할 때 문제가 발생했습니다. 예를 들어 클래스에 다음과 같은 함수가 있다고 가정 해 보겠습니다.

//Foo.h 
class Foo 
{ 
    typedef class SomeClass SomeOtherName; 

    void doSomething(const SomeOtherName& subject) 
} 

//Foo.cpp 
#include "Foo.h" 
#include "SomeClass.h" 
void Foo::doSomething(const SomeOtherName& subject) 
{ 
    sizeof(subject); //generates error C2027: use of undefined type 'SomeClass'; 
    sizeof(SomeClass); //generates same error, even though using the sizeof() 
         //the class that has been #include in the .cpp. Shouldn't 
         //the type be known by now? 
} 

또는 이렇게하면됩니다.

//Foo.h 
class SomeClass; 
class Foo 
{ 
    void doSomething(const SomeClass& subject) 
} 

//Foo.cpp 
#include "Foo.h" 
#include "SomeClass.h" 
void Foo::doSomething(const SomeClass& subject) 
{ 
    sizeof(subject); 
    sizeof(SomeClass); 
} 

Microsoft Visual C++ 6.0을 사용하고 있습니다. 이것은 컴파일러의 버그입니까, 아니면 일반적으로 표준에 대한 것입니까?

오류가있는 예제에서 sizeof (SomeClass)는 Foo에서 생성되는 새로운 typedef 형식이 아니라 typedef 인 원본 클래스임을 유의하십시오. typedef에서 forward 선언을하면 typedef가되는 클래스를 사용하여 내 능력을 제한한다는 것이 놀랍습니다.


후속 조사 : 는 그냥 엑스 코드 컴파일러를 사용하여 테스트 내를 sizeof 질문 비주얼 C++ 6.0 컴파일러 문제였다 생각합니다. 아마도 XCode 컴파일러는 정확하다고 추측 할 수는 있지만 지금은 시도 할 다른 것이 없습니다. 그래서 유익한 정보 였지만 개인적으로는 현재 상황에서 최선의 대답이 작동하지 않기 때문에 현재의 일에 개인적으로 운이 없습니다.

답변

2

typedef class SomeClass SomeOtherName; 

당신을 위해 트릭을 할 것인가?

그걸로 포인터 또는 참조에만 typedef을 사용하는 컴파일 단위는 #includeSomeClass 헤더가 필요하지 않습니다.

+0

나는 당신의 제안을 시도했다. 실제로 그것은 클래스가 포인터와 참조를 완전히 다루는 특별한 경우를 해결한다. 그러나, 그 시도하고 그 클래스 (sizeof() 복용) 뭔가 내 일을 .cpp 파일에서 찾으십시오, 여전히 문제가 있습니다. 질문을 예제로 업데이트하겠습니다. –

+0

그것은 설계된 것입니다. 컴파일러는 객체의 실제 정의를 모른 채 객체의 크기를 파악할 수 없습니다. –

+0

incomlete 타입을 다룰 때, 타입에 대한 참조 나 포인터를 선언 할 수는 있지만 컴파일러는 모두 이름을 알고 있기 때문에 그 외에는 아무것도 할 수 없다. 불완전한 타입에 대한 참조/포인터를 사용하면 클래스의 헤더 파일이 다른 헤더에 종속되는 것을 피할 수 있지만 구현시 여전히 대상 유형의 전체 선언을 포함해야합니다. 불완전한 유형을 사용하면 메소드를 인라인으로 구현할 수 없게 될 수도 있습니다. –

0

나는 이것에 관해 내 결론을 올릴 수 있습니까?

예.

//forward declaration instead of #include "SomeClass.h" 
class SomeClass; 
//now this works even without #include "SomeClass.h" 
typedef SomeClass SomeOtherName; 

이것은

나는 당신의 형식 정의가 하나를 추가하는 것이 표시되지 않습니다 나에게 매우 깨끗 코드처럼 보이지 않는 : 당신이 언급 한 문제의 답 중 하나는 당신이 할 수있는 것을 제안 값; 대신 아마 SomeClass을 선언하고 'const SomeClass&'을 직접 사용하십시오.