2012-04-11 3 views
2

Можно ли сделать декларацию в прямом выражении класса 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

Любые мысли?
Спасибо, ребята!

+0

Какое использование является объявленным вперед классом C++? просто используйте '#typedef void Clazz' в этой ситуации. –

ответ

3

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

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

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

+1

Я не знал о определении __cplusplus. Теперь все ясно. Благодарю. – Butaca

0

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

namespace a { 
    class b; 
} 

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

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

+0

object-c - это чистый суперсет C, поэтому он не распознает идентификатор пространства имен – mydogisbox

1

Вы можете объявить вперед класс в пространстве имен, как это:

namespace MyNamespace { class MyClass; };

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

+0

. Ваш ответ тоже был полезен. Благодаря! – Butaca

1

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

#ifdef __cplusplus 
namespace name{ 
#endif 
    struct classname; 
#ifdef __cplusplus 
} 
using namespace name; 
#endif 
+0

Ваш ответ тоже был полезен. Благодаря! – Butaca

Смежные вопросы