以双向方式混合目标C++和C++

Mixing Objective C++ and C++ in a bi-directional way

本文关键字:C++ 目标 混合 方式      更新时间:2023-10-16

假设我有两个目标c++对象,每个对象都包装一个给定的原生c++对象:
A、 B=目标c++对象类型
Acpp,Bcpp=c++对象类型

B.mm

#import "Bcpp.h"
#import "B.h"
@interface B ()
{
    Bcpp myBcpp; // declare instance c++ variable of type Bcpp
}
@end

在A.mm 中

#import "Acpp.h"
#import "A.h"
@interface A ()
{
    Acpp myAcpp; // declare instance c++ variable of type Acpp
}
@end
@implementation A
// method to return an instance of B from an instance of A (self)
- (B)GetBfromA
{
    Bcpp *bfroma = myAcpp.GetBfromA(); // return c++ object
    // How do i find the objective C++ object B from its wrapped c++ instance bfroma?
}
@end

这样做的原因是我们有一个成熟的c++数据结构,我们希望用目标c++对象来封装它。这是最好的方法吗?如果是,我们如何解决反向映射问题?

编辑:感谢早期的响应者,但我有一个更棘手的情况,我在上面暗示。假设函数GetBFromA()返回一个已经声明的Bcpp实例(作为B实例的实例变量)。因此,我持有一个指向Bcpp对象的指针,该对象本身就是B类型的目标C++对象的实例变量。我如何从Bcpp的实例中找到B的实例?

您可能需要做的是能够从Bcpp创建B。因此,B需要修改为-initWithBcpp:方法:

- (id)initWithBcpp:(Bcpp*)bcpp
{
    self = [super init];
    if (self != nil)
    {
        myBcpp = *bcpp;
    }
    return self;
}

然后,在GetBFromA中,您需要从Bcpp*:创建一个B

- (B*)GetBfromA
{
    Bcpp *bfroma = myAcpp.GetBfromA(); // return c++ object
    B* result = [[B alloc] initWithBcpp:bfroma];
    return result;
}