让 C++ 模型通过委托方法通知 Objective-C++ 控制器

Getting C++ model to inform Objective-C++ controller via delegation method

我用 C++ 编写了一个国际象棋游戏 model。现在,我想要一个 Objective-C++ controller 来初始化一个 model 对象并成为它的委托。

因此,当 model 完成它的任务时,它应该通知 controllercontroller 应该更新 view.

现在,当我像这样实例化 C++ 模型 时:

Model *model = new Model();
model->delegate = self;

在 Objective-C++ 中。它给了我这个错误:

Assigning to 'Delegate *' from incompatible type 'NSObject *const __strong'

据我了解,我需要将委托类型设为匿名容器(或 NSObject 类型的对象)。

像这样连接不同语言的最佳解决方案是什么?

编辑:

好的,所以我找到了解决方法,但现在我遇到了内存管理问题。我正在存储的 Objective-C 对象在退出范围时被释放。这是代码:

struct SharedObjectiveCObject {
Class sharedObjectiveCObject;
public:
    SharedObjectiveCObject() : sharedObjectiveCObject([GameViewController class]) {}
};



class Controller {

private:
    GameViewController *gameViewController; // THIS GETS RELEASED ON EXITING SCOPE (THIS IS AN OBJECT OF OBJECTIVE-C CLASS)

public:
     Controller() {
        std::unique_ptr<SharedObjectiveCObject> sharedObjectiveCObject(new SharedObjectiveCObject());

        this->gameViewController = (__bridge GameViewController*)(sharedObjectiveCObject.get()); // THIS GETS RELEASED ON EXITING SCOPE
    }

第二次编辑:

换句话说,我和this有同样的问题。

委托人需要是 Objective C class 实施适当的委托协议;你不能只坚持 C++ 对象。我的解决方案是创建一个 "relay" class 并使用指向作为消息真正目标的 C++ 对象的指针进行初始化。调用委托方法时,它会对 C++ 对象执行函数调用。

可以在项目 pianod2 的源文件 src/mediaunits/audio/osxplayer.mm 中找到示例。 class PlayerHelper 提供 AVPlayer 和 AVPlayerItem(来自 AVFoundation 框架)和 C++ 类型 AVFoundationPlayer 之间的垫片,也在 osxplayer.mm.

中定义