Можно ли использовать экземпляр класса C ++ в качестве идентификатора Objective-C ++?

При подключении моей модели данных C ++ к моему пользовательскому интерфейсу столбца таблицы Какао мне интересно, могу ли я предоставить экземпляр класса C ++ с идентификатором (идентификатором) для initWithIdentifier

// what magic needs to occur to create an id from a CPP class?
id someIDMadeFromAClassInstance = a_ptr_to_a_cpp_class_instance;

NSTableColumn *col = [[NSTableColumn alloc] initWithIdentifier:someIDMadeFromAClassInstance"];

Весь смысл в том, что когда вызывается метод источника данных NSTable objectValueForTableColumn, я могу получить идентификатор и каким-то образом преобразовать его обратно в действительный экземпляр класса C ++:

id columnIdentifer = [aTableColumn identifier];

MyCPPClass* pAValidClass = [someMagicOnTheID columnIdentifer];

pAValidClass->AClassMethod();

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

3

Решение

Указатель объекта C ++ не может быть сохранен в id переменная типа В Objective-C, id указатель на объект Objective-C неизвестного типа Поскольку объект C ++ не является объектом Objective-C, хранить указатель на объект C ++ в id,

Решение состоит в том, чтобы добавить свойство к вашему классу Objective C, которое будет хранить указатель на объект C ++. Если вы должны использовать idВы можете создать класс Objective-C, который обернет свойство, которое хранит указатель на объект C ++, например:

@interface MyCPPClassWrapper : NSObject

@property (nonatomic, assign) MyCPPClass *myCPPClass;

@end

// ...

MyCPPClassWrapper *wrapper = [[MyCPPClassWrapper alloc] initWithMyCPPClass:myCPPClass];

// Hand wrapper off to your NSTable

Взгляни на NSValue также. Он обеспечивает механизм хранения указателей в стиле C. Для NSValue вы можете сделать что-то вроде этого:

NSValue *someIDMadeFromAClassInstance = [NSValue valueWithPointer:a_ptr_to_a_cpp_class_instance];

NSTableColumn *col = [[NSTableColumn alloc] initWithIdentifier:someIDMadeFromAClassInstance"];

// ...

NSValue *columnIdentifer = (NSValue *)[aTableColumn identifier];
MyCPPClass* pAValidClass = (MyCPPClass *)[columnIdentifer pointerValue];
pAValidClass->AClassMethod();
4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]