Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 转换为C++;目标C的语法_C++_Objective C_Callback_Pjsip - Fatal编程技术网

C++ 转换为C++;目标C的语法

C++ 转换为C++;目标C的语法,c++,objective-c,callback,pjsip,C++,Objective C,Callback,Pjsip,我的背景是C/C++/C# 我在XCODE项目中使用C++库(具体地说,库是PJSIP)。要使用库,我必须将几个回调连接到我的代码,如下所示: SipTest.m 我试图在Objject C中搜索委托,但我找不到类似的情况,其中回调已经在C++中实现了,并且您想用Objto-C语法使用它。 谢谢在这种情况下,您需要使用选择器 +(void) on_reg_state:(pjsua_acc_id) acc_id { // Do work } +(void) Init {

我的背景是C/C++/C#

我在XCODE项目中使用C++库(具体地说,库是PJSIP)。要使用库,我必须将几个回调连接到我的代码,如下所示:

SipTest.m

我试图在Objject C中搜索委托,但我找不到类似的情况,其中回调已经在C++中实现了,并且您想用Objto-C语法使用它。


谢谢

在这种情况下,您需要使用选择器

+(void) on_reg_state:(pjsua_acc_id) acc_id
 {
    // Do work
 } 

 +(void) Init
 {
    pjsua_config cfg;            
    psjua_config_default(&cfg);  

    cfg.cb.on_regstate_selector = @selector(on_reg_state:);
    cfg.cb.target = self; //Self here is the class object in your 'Init' method, which is poorly named.
    //Use this like [cfg.cb.target performSelector:cfg.cb.on_regstate_selector withObject:...etc]

 }

首先,根本不需要转换任何东西。从Objut-C.</P>调用C++库是完全正确的。 其次,导致编译器错误的原因是,您试图将一个方法粘贴到应该有函数指针的位置。不能使用
&
运算符从Objective-C方法中生成函数指针。只需将
保持在\u reg\u state()
函数上,并像以前一样使用它,这也是在Apple基于C的框架中执行回调的方式(一旦您超越了高级别Objective-C API提供的功能,您就需要这样做)


第三,您的
+(void)Init
方法似乎有点奇怪。我强烈建议您编写一个名为
Init
(大写)的方法。如果要编写初始值设定项,它应该是
-(id)init
,即小写并返回
id
。不要忘记调用其超类的指定初始值设定项,检查其返回值,将其分配给self,并在
init
方法末尾返回它(如果您不熟悉,请参阅中的实现初始值设定项)。如果您的方法不是初始值设定项,请使用其他名称,例如,
-(void)createConfig

我在cfg中没有“on\u regstate\u selector”和“cb.target”?我同意Init命名。这个想法是你必须添加一个。目标+选择器是常见的范例。
 +(void) on_reg_state:(pjsua_acc_id) acc_id
 {
    // Do work
 } 

 +(void) Init
 {
    pjsua_config cfg;            
    psjua_config_default(&cfg);  

    cfg.cb.on_regstate = &on_reg_state; // ***** this is causing compile error
                                        // I tried [CLASS NAME on_reg_state] and i get   runtime error
 }
+(void) on_reg_state:(pjsua_acc_id) acc_id
 {
    // Do work
 } 

 +(void) Init
 {
    pjsua_config cfg;            
    psjua_config_default(&cfg);  

    cfg.cb.on_regstate_selector = @selector(on_reg_state:);
    cfg.cb.target = self; //Self here is the class object in your 'Init' method, which is poorly named.
    //Use this like [cfg.cb.target performSelector:cfg.cb.on_regstate_selector withObject:...etc]

 }