Прямое объявление класса 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 или нет.

Другие вопросы по тегам