2012-03-16 98 views
4

我在情感上附加到我的C++類,但我真的希望它進入一個tableview。從C++類繼承NSObject

有沒有辦法從標準C++類繼承NSObject?

這就是我試圖做的:

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

編譯器不喜歡這樣一個位。

它告訴我基地說明符必須是一個類。

我能做什麼樣的偷偷摸摸的事情?

我應該把它作爲一個標準的目標C++對象嗎?

回答

11

您不能在C++和Objective-C類之間混合使用繼承。

相反,只需製作一個包裝C++對象的標準Objective-C++對象即可。教授Obj-C對象如何將所有內容傳遞給C++對象。

+0

這是有道理的,這將是有點像在WPF – 2012-03-16 17:41:46

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

偷偷摸摸的一個視圖模型! 我喜歡它:) – 2012-03-16 17:44:24

+0

@PaulWand是的,它是。我希望你可以通過名稱動態地查找C++函數,這樣我就可以完全自動化,而無需用戶單獨添加函數。 – 2012-03-16 17:49:29

+0

這是我最終做的,我剛剛得到它 ContactViewModel * con = [contacts objectAtIndex:[indexPath row]]; [cell.textLabel setText:con> contact.name]; – 2012-03-16 18:19:20