내 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 컴파일러는 정확하다고 추측 할 수는 있지만 지금은 시도 할 다른 것이 없습니다. 그래서 유익한 정보 였지만 개인적으로는 현재 상황에서 최선의 대답이 작동하지 않기 때문에 현재의 일에 개인적으로 운이 없습니다.
나는 당신의 제안을 시도했다. 실제로 그것은 클래스가 포인터와 참조를 완전히 다루는 특별한 경우를 해결한다. 그러나, 그 시도하고 그 클래스 (sizeof() 복용) 뭔가 내 일을 .cpp 파일에서 찾으십시오, 여전히 문제가 있습니다. 질문을 예제로 업데이트하겠습니다. –
그것은 설계된 것입니다. 컴파일러는 객체의 실제 정의를 모른 채 객체의 크기를 파악할 수 없습니다. –
incomlete 타입을 다룰 때, 타입에 대한 참조 나 포인터를 선언 할 수는 있지만 컴파일러는 모두 이름을 알고 있기 때문에 그 외에는 아무것도 할 수 없다. 불완전한 타입에 대한 참조/포인터를 사용하면 클래스의 헤더 파일이 다른 헤더에 종속되는 것을 피할 수 있지만 구현시 여전히 대상 유형의 전체 선언을 포함해야합니다. 불완전한 유형을 사용하면 메소드를 인라인으로 구현할 수 없게 될 수도 있습니다. –