Предварительное объявление класса C++ с пространством имен в Objective C

Можно ли сделать предварительное объявление класса С++, который находится внутри пространства имен, в заголовочном файле Objective 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

Есть предположения?
Спасибо, ребята!


person Butaca    schedule 11.04.2012    source источник
comment
Какая польза от предварительно объявленного класса C++? просто используйте #typedef void Clazz в этой ситуации.   -  person Richard J. Ross III    schedule 11.04.2012


Ответы (4)


Вы просто объявляете его, как обычно, и оборачиваете его в проверку C++ #ifdef, когда заголовок также включен в переводы C и/или ObjC:

#ifdef __cplusplus
namespace name {
class Clazz;
} // << name
#endif

По понятным причинам вы не можете использовать name::Clazz в переводе C или ObjC, так что это работает отлично. Вам либо нужно предварительное объявление в переводе C++, либо оно не должно быть видимым для C или ObjC.

person justin    schedule 11.04.2012
comment
Я не знал об определении __cplusplus. Теперь все ясно. Спасибо. - person Butaca; 11.04.2012

Вы можете объявить свой класс как структуру в заголовках Objective-C++, а затем включить их в код C или obj-c. Те же ограничения, которые обычно применяются, также применяются и в этом случае. Единственное предостережение заключается в том, что вы должны поместить ifdef вокруг пространства имен, чтобы они не отображались при включении вашего заголовка в код C, поскольку компилятор C не знает о пространствах имен.

#ifdef __cplusplus
namespace name{
#endif
    struct classname;
#ifdef __cplusplus
}
using namespace name;
#endif
person N_A    schedule 11.04.2012
comment
Ваш ответ тоже был полезен. Спасибо! - person Butaca; 11.04.2012

Вы можете объявить передовой класс в пространстве имен следующим образом:

namespace MyNamespace { class MyClass; };

Это должно работать в Obj-C++, но если нет, вы также можете попробовать obj-c @class или просто сделать typedef void* Clazz.

person wquist    schedule 11.04.2012
comment
Ваш ответ тоже был полезен. Спасибо! - person Butaca; 11.04.2012

По крайней мере, в обычном С++ вы бы сделали что-то вроде:

namespace a {
    class b;
}

int main(){
    a::b *c;
}

Я не могу сказать, примет ли это компилятор Objective C или нет.

person Jerry Coffin    schedule 11.04.2012
comment
target-c — это чистый надмножество C, поэтому он не распознает идентификатор namespace. - person N_A; 11.04.2012