Использование класса Objective-C++ с переменными экземпляра C++ в коде Objective-C

Я пишу интерфейс класса Objective-C++, который должен использоваться как в Objective-C, так и в Objective-C++. Проблема в том, что, поскольку он должен использоваться в Objective-C, я не могу просто использовать тип C++. Я хочу сделать это с помощью указателей, и я придумал это:

@interface SXDiff : NSObject {
@private
#ifdef __cplusplus
  dtl::Diff<std::string, std::vector<std::string> > *_diff;
#else
  void *_diff;
#endif
}

...

@end

Могут ли возникнуть проблемы при этом? Есть ли лучший способ сделать это?


Обратите внимание, что использование указателей предназначено только для того, чтобы размер ivar был одинаковым как в Objective-C, так и в Objective-C++. Ивар можно использовать только внутри реализации класса SXDiff (это @private). Реализация написана на Objective-C++.


person Community    schedule 18.10.2011    source источник
comment
Просто любопытно, почему вы хотите использовать obj-c?   -  person Aditya Kumar Pandey    schedule 18.10.2011
comment
У меня есть приложение, написанное на Objective-C, и я хочу использовать код C++ только в одном из его классов.   -  person    schedule 18.10.2011
comment
Какой компилятор вы используете? С LLVM 2.0+ вы можете объявить свой dtl::Diff в файле реализации, используя расширение класса.   -  person Joe    schedule 18.10.2011
comment
@Joe Я использую Apple clang версии 3.0 на основе LLVM 3.0svn.   -  person    schedule 18.10.2011
comment
Почему бы вообще не использовать #ifdef и просто использовать void*. Другим вариантом было бы обернуть класс С++ в структуру и использовать ее для сокрытия (идиома pimpl). Поскольку C знает структуры и указатели на структуры, это тоже должно работать.   -  person cli_hlt    schedule 18.10.2011
comment
Попробуйте переместить объявление ivar в расширение класса в файле .mm.   -  person Joe    schedule 18.10.2011


Ответы (1)


В Apple LLVM версии 2.0+ попробуйте переместить весь код C++ из заголовка в расширение класса.

//SXDiff.h
@interface SXDiff : NSObject {
}

...

@end


//SXDiff.mm
#include "dtl/dtl.hpp"

@interface SXDiff()
{
    dtl::Diff<std::string, std::vector<std::string> > *_diff;
}
@end

@implementation SXDiff

...

@end
person Joe    schedule 18.10.2011
comment
Я не знал, что это возможно, потому что GCC всегда выдавал мне ошибку при попытке сделать это. лязг нет. Спасибо! Это также устраняет необходимость в указателе. - person ; 18.10.2011
comment
Кстати, интересная новая функция в последнем SDK: теперь вы можете добавлять ивары, используя блок {} после @implementation, а не используя расширение класса. - person Rob Napier; 19.10.2011