通过委托方法让C++模型通知Objective-C++控制器
Getting C++ model to inform Objective-C++ controller via delegation method
我用C++编程了一个国际象棋游戏模型。现在,我想要一个Objective-C++控制器来初始化模型对象并成为它的委托。
因此,当模型完成其任务时,它应该通知控制器,并且管理员应该更新视图。
现在,当我实例化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
}
第二版:
换句话说,我有同样的问题。
委托需要是实现适当委托协议的Objective C类;你不能只停留在C++对象中。我的解决方案是创建一个"中继"类,该类使用指向C++对象的指针初始化,C++对象是消息的真正目标。当调用委托方法时,它会对C++对象执行函数调用。
一个例子可以在项目pianod2的源文件src/mediaunits/audio/osxplayer.mm中找到。类PlayerHelper提供了AVPlayer和AVPlayerItem(来自AVFoundation框架)以及C++类型AVFoundationPlayer的委托之间的垫片,也在osxplayer.mim中定义。
相关文章:
- QTableView:endMoveRows在模型中重置水平页眉大小
- 将IBM Rhapsody模型集成到VS 2019中
- 旋转模型矩阵时的形状失真
- 成员函数调用和C++对象模型
- 连接 dockerized 模型和 dockerized 数据库时出现"无法 SQLConnect"错误
- 打印 ONNXRUNTIME::图形没有模型
- 函数如何通知用户它基于函数原型抛出异常?
- 如何在ECS框架中更新组件数据和通知系统
- 当 I2C 值在C++中发生变化时收到通知
- C++内存模型和位字段的最大序列
- 如何设计具有不同类型的通知和观察器的观察者模式?
- 当可输入框在窗口中处于活动状态时获得通知的任何方法
- 使用SIR模型的疾病爆发模拟
- Qt - QVector 和模型视图 - 从列表视图获取自定义类的最佳方法是什么?
- 如何在 ECS 模型中组织实体?
- 在官方张量流 resnet50 模型上运行 tflite 精度工具
- 是否有必要获取锁并在不需要唤醒线程时通知condition_variable?
- Libtorch:如何加载ONNX模型?
- Qt 5.2模型视图模式:如何通知模型对象底层数据结构的变化
- 通过委托方法让C++模型通知Objective-C++控制器