Унаследовать NSObject от класса C ++ - PullRequest
4 голосов
/ 16 марта 2012

Я эмоционально привязан к своему классу C ++, но я действительно хочу, чтобы он вошел в табличное представление.

Есть ли способ создать подкласс NSObject из стандартного класса c ++?

thisвот что я пытался сделать:

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

Компилятору не понравился один бит.

Он говорит мне, что базовый спецификатор должен быть классом.

IsЕсть ли какая-нибудь хитрая вещь, которую я могу сделать?

Должен ли я просто сделать это стандартным объектом C ++?

Ответы [ 3 ]

11 голосов
/ 16 марта 2012

Вы не можете смешивать наследование между классами C ++ и Objective-C.

Вместо этого просто создайте стандартный объект Objective-C ++, который обернет ваш объект C ++.Научите объект Obj-C, как передать все через ваш объект C ++.

3 голосов
/ 16 марта 2012

Нет, не возможно.

Классы 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;
}
1 голос
/ 16 марта 2012

В шаблоне проектирования MVC ваш контроллер должен управлять тем, как ваша модель представлена ​​в табличном представлении. Таким образом, вы можете просто сохранить ваш объект C ++, ваш TableViewController будет иметь указатель на него, а TableViewController будет решать, как все будет выглядеть в табличном представлении.

...