Вперед, объявив класс 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;
}

Фактическое определение происходит в файле .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, потому что компилятор очень недоволен. Вполне возможно, что то, как эта штука спроектирована, заставит меня пойти другим путем.

0

Решение

Вы не можете получить доступ к переменным-членам неполных структур / классов. Для этого вам нужно полное определение. Обычно вы используете предварительные объявления в заголовочных файлах, чтобы все, что включает этот заголовок, не тянуло много ненужных других заголовочных файлов, в которых оно не нуждалось, но для исходных файлов вам обычно нужны полные определения.

Поэтому я бы предложил изменить ваш код на что-то вроде этого:

// 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.
6

Другие решения

Вы можете сделать несколько вещей с неполным типом, но доступ к членам объекта этого типа не является одним из них.

Простым возможным решением будет вспомогательная функция, которая определена где-то, где доступен полный тип:

void set_p_favorite_integer(MyCPlusPlusClass*, int);
// ...
set_p_favorite_integer(my_CPlusPlus, 0);
1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector