Я пишу класс 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;
}
Фактическое определение происходит в файле .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 { ... }
Моя цель — использовать MyCPlusPlusClass в MyCode.m, но я не могу включить файл .mm, потому что компилятор очень недоволен. Вполне возможно, что то, как эта штука спроектирована, заставит меня пойти другим путем.
Вы не можете получить доступ к переменным-членам неполных структур / классов. Для этого вам нужно полное определение. Обычно вы используете предварительные объявления в заголовочных файлах, чтобы все, что включает этот заголовок, не тянуло много ненужных других заголовочных файлов, в которых оно не нуждалось, но для исходных файлов вам обычно нужны полные определения.
Поэтому я бы предложил изменить ваш код на что-то вроде этого:
// 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.
Вы можете сделать несколько вещей с неполным типом, но доступ к членам объекта этого типа не является одним из них.
Простым возможным решением будет вспомогательная функция, которая определена где-то, где доступен полный тип:
void set_p_favorite_integer(MyCPlusPlusClass*, int);
// ...
set_p_favorite_integer(my_CPlusPlus, 0);