Наследовать NSObject от класса C++

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

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

это то, что я пытался сделать:

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

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

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

Могу ли я сделать какую-нибудь подлую вещь?

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


person Paul Wand    schedule 16.03.2012    source источник


Ответы (3)


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

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

person BJ Homer    schedule 16.03.2012
comment
Это имеет смысл, это было бы похоже на модель представления в WPF. - person Paul Wand; 16.03.2012

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

Классы C++ и Objective-C реализованы очень по-разному. C++ использует виртуальную таблицу для поиска функций и является статическим.

Однако 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;
}
person Richard J. Ross III    schedule 16.03.2012
comment
@PaulWand да, это так. Однако я бы хотел, чтобы вы могли динамически искать функцию C++ по имени, чтобы я мог сделать ее полностью автоматизированной, и пользователю не нужно было бы добавлять функции по отдельности. - person Richard J. Ross III; 16.03.2012
comment
это то, что я в итоге сделал, я только что заработал ContactViewModel *con=[contacts objectAtIndex:[indexPath row]]; [cell.textLabel setText:con-›contact.name]; - person Paul Wand; 16.03.2012

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

person shawkinaw    schedule 16.03.2012