2011-03-27 4 views
7

Objective-C와 C++을 혼합했습니다. 그러나 Objective-C++ 사용을 최소화하고 싶습니다. 왜냐하면 Objective-C와 C++ 둘다에 어떤 종류의 제한이 있기 때문입니다.Objective-C++를 사용하여 Objective-C 클래스로 C++ 클래스를 최소화하는 데 권장되는 방법은 무엇입니까?

현재 저는 이것을 이렇게 사용하고 있습니다.

// A.h, Objective-C 
#import "B.h" 
@interface A 
{ 
    B* b; 
} 
@end 

// B.h, Objective-C++ 
@interface B 
{ 
    void* c; 
} 

// C.h, C++ 
class C 
{ 
}; 

나는 B.h에서 C.h을 포함 할,하지만 난 그것을 한 경우, B.hA.h로 가져올 수 없습니다. 그래서 변수 cvoid* 유형으로 두어야합니다. 이것은 C의 멤버를 B.m 파일에 자유롭게 사용할 수 있기 때문에 큰 문제는 아닙니다. 그러나 나는 항상 그것을 던져야 만합니다. 이것은 불분명 한 무언가를 느낀다. 그래서 나는 더 좋은 방법을 사용하고 싶습니다.

답변

15

이 작업을 수행하는 데는 몇 가지 방법이 있지만 제 생각에는 가장 좋은 방법은 'PIMPL' idiom을 사용하는 것입니다.이 방법은 C++에서 매우 일반적입니다. 헤더를 순수한 Objective-C와 순수한 C++로 만들고 실제 구현을 포함하는 forward-declared struct에 대한 포인터를 사용합니다. 이 파일은 .mm 파일에 정의되어 있으며 Objective-C++를 사용할 수 있습니다. 그것은 또한 몇 가지 다른 방법을 보여줍니다 - http://philjordan.eu/article/strategies-for-using-c++-in-objective-c-projects가 : 당신의 예에서

, 당신은 같은 것을 할 것이다 : 나는 실제로 정확하게이 문제를 해결하는 기사를 작성했습니다

// B.h, pure Objective-C: 
struct BImpl; 
@interface B 
{ 
    struct BImpl* impl; 
} 
// ... 


// B.mm, mixed: 
#include "C.h" 
struct BImpl // since this is C++, it can actually have constructors/destructors 
{ 
    C* my_c; 
    BImpl() : my_c(new C) {} 
    ~BImpl() { delete my_c; my_c = NULL; } 
}; 
// make sure to alloc/initialise impl (using new) in B's init* methods, 
// and free it (using delete) in the dealloc method. 

을, 당신은 그것을 유용하게 찾을 수 있습니다 원래 void* 방법을 포함하여

+4

답변으로 이것을 선택하기 위해 남은 4 분을 기다릴 수 없습니다! – Eonil

4

pmjordan이 his blog article에 쓴대로 @interface 선언 내의 BImpl은 다음과 같이 'struct'키워드가 필요합니다.

struct BImpl; 
@interface B 
{ 
    struct BImpl* impl; 
} 

나는 실수로이 문제를 해결했다고 생각합니다. * .m 파일이 많을 때이 헤더를 포함해야하는 경우 큰 차이가 있습니다. 추가 된 'struct'키워드는 Objective-C 컴파일러가이 헤더를 가져 오는 다른 .m 파일에 대해이 헤더를 순수한 C로 인식하도록합니다. 그렇지 않으면이 헤더를 가져 오는 다른 * .m 파일은 컴파일되지 않습니다. 이 작은 솔루션을 사용하면 * .m 파일을 .mm 파일로 변경하지 않아도됩니다. 경우에 따라 원래 .m 파일을 .mm으로 변경하면 많은 컴파일 오류가 발생합니다.

+0

pmjordan의 블로그 기사에 링크를 추가 할 수 있습니까? – Stephan

+0

예, 했어요. 사실 pmjordan은이 질문에 대한 첫 번째 대답의 저자입니다. 나는 원래의 대답에서 링크를 얻었다. 당신은 또한 그의 대답에 원래 링크를 사용할 수 있습니다. – DuncanSungWKim

+1

이 답변은 첫 번째 답변에 통합되어 있습니다. 나는이 답변을 게시 한 후 제 제안을 채택한 것에 대해 @pmjordan에게 정말 감사드립니다. – DuncanSungWKim

관련 문제