Хорошо, чтобы ответить на ваш вопрос:
reportwindow.h дополнительно включен в файл .cpp, если это имеет значение.
Это действительно имеет значение,Любой модуль компиляции (в данном случае файл cpp), который касается кода Objective-C, должен быть переименован в .mm или .m.Включение заголовка, который, в свою очередь, включает в себя материал Objective-C в файле C ++, приведет к проблеме, с которой компилятор C ++ видит код Objective-C, который он не может обработать.
Переименование файла cpp в mm выберет параметр Objective-C во время компиляции (а не когда файл называется cpp или c) и, следовательно, позволит скомпилировать материал с токенами Objective-C (в основном, ").@ "в вашем случае).
Альтернативой может быть не включение класса делегата Objective-C в ваш класс C ++, а включение указателя на ваш класс C ++ в делегате Objective-C (т. е. реализовать егонаоборот).Таким образом, вы можете расположить вещи так, чтобы код Objective-C не касался кода C ++.
Редактировать: На самом деле, я бы предпочел второе предложение.Вот пример:
DelegateClass.h:
class MyCPPClassHandlingStuff;
@interface MyDelegateObject : NSObject <SomeDelegateProtocol> {
MyCPPClassHandlingStuff *m_handlerInstance;
}
- (id) initWithCPPInstance:(MyCPPClassHandlingStuff*)cppInstance;
- (void) theDelegateProtocolMethod;
@end
DelegateClass.mm
#include "MyCPPClassHandlingStuff.h"
@implementation MyDelegateObject
- (id) initWithCPPInstance:(MyCPPClassHandlingStuff*)cppInstance
{
self = [super init];
if (self) {
m_handlerInstance = cppInstance;
}
return self;
}
- (void) theDelegateProtocolMethod
{
if (m_handlerInstance)
m_handlerInstance->handleDelegateMethod();
}
@end
А также MyCPPClassHandlingStuff.h:
#ifndef __MyCPPClassHandlingStuff_H__
#define __MyCPPClassHandlingStuff_H__
class MyCPPClassHandlingStuff
{
public:
MyCPPClassHandlingStuff();
void handleDelegateMethod();
};
#endif /* __MyCPPClassHandlingStuff_H__ */
MyCPPClassHandlingStuff может быть инициализирован из Objective C, но вы не можете инициализировать любой класс Objective C из кода C ++.Если вам нужно использовать Objective-C в вашем коде C ++, вам придется скомпилировать его как Objective-C (то есть использовать файл .mm).Я оставляю детали .cpp в качестве упражнения для читателя;)