2012-03-16 18 views
4

私は感情的に私のC++クラスにアタッチされていますが、実際にはそれをテーブルビューにしたいと思っています。C++クラスからNSObjectを継承

NSObjectを標準のC++クラスからサブクラス化する方法はありますか?

これは私がしようとしたものです:

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

コンパイラはそれを1ビットを好きではなかったです。

基本指定子がクラスでなければならないことがわかります。

私にできることは何もありませんか?

私はそれを標準的な目的のC++オブジェクトにする必要がありますか?

答えて

11

C++クラスとObjective-Cクラスの間で継承を混合することはできません。

代わりに、C++オブジェクトをラップする標準のObjective-C++オブジェクトを作成します。あなたのC++オブジェクトにすべてを渡す方法をObj-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

卑劣でのviewmodelのようになります! 私はそれが好きです:) –

+0

@PaulWandはい、それです。私はあなたがダイナミックにC++関数を名前で探すことができますが、ユーザが関数を個別に追加する必要はなく、完全に自動化できると思います。 –

+0

これは私がやったことです、私はちょうどそれを働いた ContactViewModel * con = [contacts objectAtIndex:[indexPath row]]; [cell.textLabel setText:con-> contact.name]; –

関連する問題