2010-02-14 3 views
17

C++과 Objective-C를 섞어 쓰려고합니다. Objective-C와 C++ 코드 사이에 단일 인터페이스 클래스를 갖고 싶습니다. 따라서 ViewController 인터페이스에 영구 C++ 객체를 갖고 싶습니다.Objective-C 클래스에 C++ 오브젝트 추가

이없는 유형 'myCppFile'의 선언을 금지함으로써 실패

:

#import <UIKit/UIKit.h> 
#import "GLView.h" 
#import "myCppFile.h" 

@interface GLViewController : UIViewController <GLViewDelegate> 
{ 
    myCppFile cppobject; 
} 

@end 

그러나이 (내가 cppobject 통화 사이의 유지를 원하기 때문에 그것은 작동하지 않습니다 .mm 구현 파일에서 잘 작동합니다)

#import "myCppFile.h" 
@implementation GLViewController 
- (void)drawView:(UIView *)theView 
{ 
    myCppFile cppobject; 
    cppobject.draw(); 
} 

답변

27

당신은 opaque pointers을 사용해야 만은 C를 포함 ++ Objective-C 클래스를 구현하는 파일의 헤더. 당신 ++ 오브젝티브 C를 사용하는 헤더를 포함하는 다른 파일을 강요하지 않는 방법 :

// header: 
#import <UIKit/UIKit.h> 
#import "GLView.h" 

struct Opaque; 

@interface GLViewController : UIViewController <GLViewDelegate> 
{ 
    struct Opaque* opaque; 
} 
// ... 
@end 

// source file: 
#import "myCppFile.h" 

struct Opaque { 
    myCppFile cppobject; 
}; 

@implementation GLViewController 
// ... create opaque member on initialization 

- (void)foo 
{ 
    opaque->cppobject.doSomething(); 
} 
@end 
+0

고마워, 다른 제안은 작동하지 않는 것 같았고, 내 객체를 "id *"로 선언 한 다음 사용하려는 모든 곳에서 올바른 유형으로 캐스팅했습니다. 이것은 같은 생각처럼 보이지만 모든 여분의 캐스트를 수행 할 필요가 없으므로 훨씬 더 깨끗합니다. – Winder

+2

저는 항상 캐스팅보다 불투명 한 포인터를 선호합니다 - 조금 더 많은 작업이 될 수도 있지만 완전한 유형의 안전성을 다시 얻게됩니다. –

+0

나는 C/C++ 랩핑을 위해 광범위하게 사용하는 불투명 포인터를 가지고 놀았지만, 지금까지는 실제로 이득을 보지 못했다. 이 스타일을 void * 기반 스타일에 여기에 ("불투명"이 할당되고 해제 된 몇 가지 코드와 함께) 비교할 수 있습니까? http://robnapier.net/blog/wrapping-c-objc-20 –

0

나는 당신이 당신의 프로젝트 설정에 true에 다음 플래그를 설정할 필요가 있다고 생각 :

GCC_OBJC_CALL_CXX_CDTORS = YES 
,

Objective-C 클래스에서 C++ 객체를 인스턴스화 할 수 있어야합니다.

+0

이 작동하지 않았다. 저는 Xcode 3.2.1과 3.0 아이폰 SDK를 사용하고 있습니다. – Winder

3

GLViewController.h이 포함 된 모든 파일이 Objective-C++ 소스 (* .mm)인지 확인하십시오. 당신이 당신의 뷰 컨트롤러의 헤더 ++ 코드를이 헤더는 그것을 이해할 수 있어야 가져올 모든 소스, C를 포함 그래서 그들은 목표 - C++에 있어야하는 경우

2

당신은 당신의 .mm 파일에서 인터페이스 블록에서 C++ 객체를 선언해야합니다. .mm에서

:

#include "SomeCPPclass.h" 

@interface SomeDetailViewController() { 
    SomeCPPclass* _ipcamera; 
} 
@property (strong, nonatomic) UIPopoverController *masterPopoverController; 
- (void)blabla; 
@end 
+0

()을주의 깊게 살펴보십시오 :이게 검은 색 (et)입니다. – goelectric

관련 문제