从C ++类继承NSObject

时间:2012-03-16 17:27:27

标签: ios inheritance objective-c++ nsobject

我在情感上依赖于我的C ++课程,但我真的希望它能进入一个tableview。

有没有办法从标准的c ++类中继承NSObject?

这是我试图做的事情:

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

编译器不喜欢它。

它告诉我基本说明符必须是一个类。

我能做些偷偷摸摸的事吗?

我应该把它作为标准的目标C ++对象吗?

3 个答案:

答案 0 :(得分:11)

您不能在C ++和Objective-C类之间混合继承。

相反,只需创建一个包装C ++对象的标准Objective-C ++对象。教导Obj-C对象如何将所有内容传递给C ++对象。

答案 1 :(得分:3)

不,不可能。

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;
}

答案 2 :(得分:1)

在MVC设计模式中,您的控制器应该管理模型在表视图中的表示方式。所以,你可以保留你的C ++对象,你的TableViewController将有一个指针,TableViewController将决定事物在表视图中的显示方式。