我正在编写一个需要在C ++类实例上进行函数调用的Objective-C类。我发现了this suggestion,但是如果我尝试它,我会因为'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文件,因为编译器非常不满意。这件事的架构方式可能会让我走另一条路。
答案 0 :(得分: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.
答案 1 :(得分:1)
您可以在不完整类型上执行许多操作,但访问该类型对象的成员不是其中之一。
一个简单的可能解决方案是在完全类型可用的地方定义的辅助函数:
void set_p_favorite_integer(MyCPlusPlusClass*, int);
// ...
set_p_favorite_integer(my_CPlusPlus, 0);