在Objective-C中声明一个C++类

Ben*_*ynn 0 c++ objective-c

我正在编写一个Objective-C类,需要在C++类实例上进行函数调用.我发现了这个建议,但如果我尝试它,我会因为'struct MyCPlusPlusClass'类型的定义不完整而出错

struct MyCPlusPlusClass;

typedef struct MyCPlusPlusClass MyCPlusPlusClass;

@interface MyBridgeClass() {
    MyCPlusPlusClass *my_CPlusPlus;
}

...

- (id)initWithMrGame:(MyCPlusPlusClass *)cPlusPlus
{
    self = [super init]; 
    if (self) {
        my_CPlusPlus = cPlusPlusClass;
        my_CPlusPlus->p_favorite_integer = 0; // Compiler error
    }
    return self;
}
Run Code Online (Sandbox Code Playgroud)

实际定义发生在由预编译器生成的.mm文件中,只是为了添加另一层挑战.

我怎么能让这个工作?

编辑:解释亚当的答案

// in MyCode.h

struct MyCPlusPlusClass;  // Forward declaration, no need for #include/#import

@interface MyBridgeClass() {
    struct MyCPlusPlusClass *my_CPlusPlus;
}


// in MyCode.m
#include MyCode.h


// in BigGenerateFile.mm
class MyCPlusPlusClass;

class MyCPlusPlusClass { ... }
Run Code Online (Sandbox Code Playgroud)

我的目标是能够在MyCode.m中使用MyCPlusPlusClass,但我不能包含.mm文件,因为编译器非常不满意.这件事的架构方式可能会让我走的路不同.

Ada*_*eld 6

您无法访问不完整结构/类的成员变量.为此,您需要完整定义.通常,您在头文件中使用前向声明,以便包含该头的任何内容都不会引入大量不需要的其他不必要的头文件,但对于源文件,您通常需要完整定义.

所以我建议你改变你的代码:

// Header file (.h)
struct MyCPlusPlusClass;  // Forward declaration, no need for #include/#import

@interface MyBridgeClass() {
    struct MyCPlusPlusClass *my_CPlusPlus;
}

// Source file (.mm)
#include "MyCPlusPlusClass.h"
...
// Can now access my_CPlusPlus->p_favorite_integer etc.
Run Code Online (Sandbox Code Playgroud)