Прямое объявление класса C++ в пространстве имен в в Objective C
Можно ли сделать предварительное объявление класса C++, который находится внутри пространства имен, в заголовочном файле Objective C?
Класс C++ для последующей декларации в Objective C:
namespace name
{
class Clazz
{
};
}
Я знаю, что могу, если класс C++ не находится в пространстве имен. Взято с http://www.zedkep.com/blog/index.php?/archives/247-Forward-declaring-C++-classes-in-Objective-C.html
Какие-нибудь мысли?
Спасибо, парни!
4 ответа
Вы просто объявляете это как обычно, и оборачиваете это в C++ #ifdef
проверьте, включен ли заголовок в переводы C и / или ObjC:
#ifdef __cplusplus
namespace name {
class Clazz;
} // << name
#endif
По понятным причинам вы не можете использовать name::Clazz
в переводе C или ObjC, так что это работает отлично. Вы либо нуждаетесь в предварительном объявлении в переводе C++, либо оно не должно быть видимым для C или ObjC.
Вы можете заранее объявить ваш класс как структуру в ваших заголовках target-C++, а затем включить их в код C или obj-c. Те же самые ограничения, которые обычно применяются, также применимы к этому случаю. Единственное предостережение в том, что вы должны поместить ifdefs вокруг пространства имен, чтобы они не отображались при включении вашего заголовка в код C, так как компилятор C не знает о пространствах имен.
#ifdef __cplusplus
namespace name{
#endif
struct classname;
#ifdef __cplusplus
}
using namespace name;
#endif
Вы можете объявить класс пересылки в пространстве имен следующим образом:
namespace MyNamespace
{
class MyClass;
};
Он должен работать в Obj-C++, но если нет, вы можете попробовать obj-c @class
или просто сделать typedef void* Clazz
,
По крайней мере, в обычном C++ вы бы сделали что-то вроде:
namespace a {
class b;
}
int main(){
a::b *c;
}
Я не могу сказать, примет ли это компилятор Objective C или нет.