2012-03-16 2 views
4

감정적으로 내 C++ 클래스에 연결되어 있지만 실제로 테이블 뷰로 들어가기를 원합니다.C++ 클래스에서 NSObject 상속

표준 C++ 클래스에서 NSObject를 하위 클래스로 만드는 방법이 있습니까?

이 내가하고 뭘하려 :

class Model : NSObject { 
public: 
    NSString *key; 
}; 

이 컴파일러는 그것을 하나 개의 비트를 좋아하지 않았다.

기본 지정자가 클래스 여야 함을 알려줍니다.

내가 할 수있는 짓궂은 일이 있습니까?

표준 목표 C++ 객체로 만들어야합니까?

답변

11

C++ 클래스와 Objective-C 클래스간에 상속을 혼합 할 수 없습니다.

대신 C++ 객체를 래핑하는 표준 Objective-C++ 객체를 만드십시오. Obj-C 객체에 C++ 객체로 모든 것을 전달하는 법을 가르쳐주십시오.

+0

, 그것은 좀 WPF –

1

MVC 디자인 패턴에서 컨트롤러는 모델이 테이블보기에서 표현되는 방식을 관리해야합니다. 그래서, 당신은 C++ 객체를 유지할 수 있습니다. 당신의 TableViewController는 포인터를 가질 것이고, TableViewController는 테이블 뷰에 어떤 것들이 나타나는지를 결정할 것입니다.

2

아니요.

C++ 및 Objective-C 클래스는 매우 다른 방식으로 구현됩니다. C++은 함수 검색을 위해 vtable을 사용하며 정적입니다.

그러나 Objective-C는 동적 사전 조회를 사용하며 런타임에 메소드를 추가 할 수 있습니다.

그러나, 당신은 당신이 원하는 것을 할 객체 구성을 사용할 수 있습니다 의미가

// MyCPPClass.cpp 
class MyCPPClass { 
    int var; 

public: 
    void doSomething(int arg) 
    { 
     var += arg; 
     std::cout << "var is: " << var << std::endl; 
    } 
}; 

// MyCPPWrapper.h 
#ifndef __cplusplus 
typedef void MyCPPClass; 
#endif 

@interface MyCPPWrapper : NSObject 
{ 
    @public 
    MyCPPClass *cppObject; 
} 

-(void) doSomething:(int) arg; 

@end 

// MyCPPWrapper.mm 
@implementation MyCPPWrapper 

-(void) doSomething:(int)arg 
{ 
    if (cppObject) 
     cppObject->doSomething(arg); 
} 

@end 

// main.mm 
int main(int argc, const char * argv[]) 
{ 
    @autoreleasepool { 
     MyCPPWrapper *cppWrapper = [MyCPPWrapper new]; 
     cppWrapper->cppObject = new MyCPPClass(); 

     [cppWrapper doSomething:10]; 
     [cppWrapper doSomething:15]; 
    } 

    return 0; 
} 
+0

음흉의 뷰 모델처럼 될 것입니다! 나는 그것을 좋아한다 :) –

+0

@ Paulwand 예, 그렇습니다. 필자는 C++ 함수를 동적으로 이름으로 검색 할 수 있으므로 사용자가 함수를 개별적으로 추가 할 필요없이 완전히 자동화 할 수 있기를 바랍니다. –

+0

이것이 내가 한 일입니다. 그냥 작동 시켰습니다. ContactViewModel * con = [contacts objectAtIndex : [indexPath row]]; [cell.textLabel setText : con-> contact.name]; –