0

我正在编写一个需要对 C++ 类实例进行函数调用的 Objective-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;
}

实际定义出现在由预编译器生成的 .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 { ... }

我的目标是能够在 MyCode.m 中使用 MyCPlusPlusClass,但我不能包含 .mm 文件,因为编译器非常不高兴。可能这个东西的架构方式会让我走一条不同的路。

4

2 回答 2

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.
于 2012-09-04T19:33:44.367 回答
1

您可以对不完整的类型执行许多操作,但访问该类型对象的成员不是其中之一。

一个简单的可能解决方案是在完整类型可用的地方定义一个辅助函数:

void set_p_favorite_integer(MyCPlusPlusClass*, int);
// ...
set_p_favorite_integer(my_CPlusPlus, 0);
于 2012-09-04T19:28:43.767 回答