2013-04-10 6 views
1

내가주는 XMLElement로 자체를 초기화 할 모델 클래스가있는 iOS 응용 프로그램을 작성하고 있습니다.목표 C에서 전방 선언 구조체

저는 XML 부분에 TBXML을 사용하고 있습니다.

모델 클래스의 헤더는 다음과 같습니다

@interface CatalogItem : NSManagedObject 

@property (nonatomic, retain) NSString * name; 
@property (nonatomic, retain) NSManagedObject *group; 

-(id)initWithXMLElement:(TBXMLElement*)element; 

@end 

을 이제 대신 TBXMLElement가 정의되어있는 헤더를 포함, 내가 그것을 선언 전달하고 싶습니다 : 클래스 정의 전에 struct TBXMLElement. 그러나 내 선언이 작동하지 않는다고 말하는 "예상 유형"오류가 발생합니다. 이게 내가 이것에 대해 어떻게 생각하지 않니?

헤더 파일에 헤더 파일을 포함하여 이해하는 것은 좋지 않습니다. 컴파일러는 TBXMLElement의 내부 동작을 알 필요가 없습니다. 단지 컴파일 타임에 존재하거나 존재할 것입니다.

+0

나쁜 연습과 오류에 대한 울음. 두 가지 다른 시나리오. # 가져 오기 및 앞으로 이동. :) –

+5

@AnoopVaidya 전혀 나쁜 습관이 아닙니다. 사실, 그것은 시스템 프레임 워크 전체에서 사용됩니다. 예를 들어보십시오. 'CFStringRef'. – bbum

+0

** Josh Elias **는 bbum의 코멘트를 읽어야합니다. –

답변

4

구조체의 전방 선언은 항상 사용되지만 헤더 가져 오기를 여전히 포함합니다. 동기 부여는 개발자가 구조에 직접 침투하지 못하도록하는 것입니다. 나는. CFString을보십시오. 구조체로 구현되지만 구조체 내용을 직접 만질 수는 없습니다. 대신 구조체 내용을 조작하기위한 전체 API가 있습니다. 따라서 바이너리 호환성을 손상시키지 않고 CFString의 구현 세부 사항을 변경할 수 있습니다. 헤더에서

(API가 TBXMLElement*와 관련된 어떤 정의 이상적 헤더) :

TBXMLElement.h :

typedef const struct TBLXMLElement *TBXMLElementRef; 

extern TBXMLElementRef TBLXMLCreateElement(); 
... etc ... 

다음, TBLXMLElementAPI의 구현을 포함하는 실행 파일 :

TBXMElement.c (가되는 가정 할 파일 C)

typedef struct __TBLXMLElement { 
    ... struct members here ... 
} TBLXMLElement; 

TBXMLElementRef TBLXMLCreateElement() 
{ 
    return (TBXMLElementRef)malloc(sizeof(TBLXMLElement)); 
} 
... etc .... 
0

당신은 그것이 struct일까요? 그것은 수업이 아닌가요? 그렇다면 앞으로 선언은 @class TBXMLElement

일 것입니다. 실제로는 struct 일 경우 정의 된 헤더를 가져 오기 만하면됩니다.

+0

실제로 구조체입니다. 내부 헤더를 가져 오는 것이 원래 생각했던 것만 큼 나쁘지는 않습니다. –