Вызов Objective-C родителя из C ++ объекта

Создание расширений аудиоустройства на iOS требует смешивания классов C ++ и Objective-C. В результате теперь у меня есть объект Objective-C с объектом C ++ в качестве одной из его переменных.

Мне бы хотелось, чтобы дочерний объект C ++ мог уведомлять своего родителя / владельца Objective-C об определенных изменениях состояния.

В псевдокоде:

void cppChildObject::callMom() {
objectiveCParent::notificationMethod();
}

Это возможно элегантным способом?

1

Решение

Это зависит от того, как вы определяете элегантный … Это возможно довольно элегантным способом, если класс C ++ находится в файле Objective-C ++ (класс с расширением .mm) и не используется непосредственно кодом C ++, который не находится в Objective-C ++ исходный файл. Проблема в том, что код C ++ может использовать типы Objective-C, только если он находится в исходном файле Objective-C ++. Вот быстрый пример, надеюсь, вы найдете его полезным.

Файл Objective-C ++, mylib.mm (обратите внимание на расширение .mm):

#import "objcpp.h"#import <stdio.h>
#import "cpp.h"
// A C++ class in an Objective-C++ file.
// This C++ class would not need to sub-class ParentNotifier, and ParentNotifier
// would not be needed at all if it were not for OutsiderCPP, which talks to its
// Objective-C parent through InsiderCPP.
class InsiderCPP : public ParentNotifie {
public:
InsiderCPP(MyClassOCPP * parent) : myParent(parent){}
void doSomething() {
callMom("To Mom from insider.");
}
void callMom(const char * msg) {
[myParent notificationMethod:msg];
}
private:
MyClassOCPP * __weak myParent;
};

@interface MyClassOCPP ()

@property InsiderCPP * insiderChild;
@property OutsiderCPP * outsiderChild;

@end

@implementation MyClassOCPP
-(id)init {
self.insiderChild = new InsiderCPP(self);
self.outsiderChild = new OutsiderCPP(self.insiderChild);
return self;
}
-(void)doWork {
self.insiderChild->doSomething();
self.outsiderChild->doSomething();
}
-(void)notificationMethod:(const char *)msg {
printf("Parent has been notified with: %s\n", msg);
}
-(void)dealloc {
delete self.insiderChild;
delete self.outsiderChild;
}
@end

Вот соответствующий заголовок, objcpp.h:

#ifndef objcpp_h
#define objcpp_h

#import <Foundation/Foundation.h>

@interface MyClassOCPP : NSObject
-(id)init;
-(void)dealloc;
-(void)doWork;
-(void)notificationMethod:(const char*)msg;
@end

#endif

Вот «чистый» исходный файл C ++ (mylib.cpp) не имеет ничего общего с Objective-C:

#include <stdio.h>
#include "cpp.h"
void OutsiderCPP::callMom(const char * m) {
myParent->callMom(m);
}
void OutsiderCPP::doSomething() {
callMom("To Mom from outsider.");
}

и вот соответствующий заголовок (cpp.h):

#ifndef cpp_h
#define cpp_h

class ParentNotifier
{
public:
virtual void callMom(const char *) = 0;
};

class OutsiderCPP
{
public:
OutsiderCPP(ParentNotifier * p) : myParent(p) {}
void doSomething();
void callMom(const char *);

private:
ParentNotifier * myParent;
};

#endif

Обратите внимание, что этот пример только для иллюстрации и не является качеством продукции.

0

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

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

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