Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.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+;调用Objective-C方法+;方法_C++_Objective C_Objective C++ - Fatal编程技术网

C++ 从C+;调用Objective-C方法+;方法

C++ 从C+;调用Objective-C方法+;方法,c++,objective-c,objective-c++,C++,Objective C,Objective C++,你好,我知道这个问题已经讨论过好几次了,但我觉得没有其他解释适合我。也许这是不可能的,但是。。。目前我有MM文件,它看起来像(init方法/头文件)Obj-C,除了少数C++方法(库LIVE55,我用C++编写),我可以调用Obj-C的C++方法就好了。但是当我想在C++中调用Obj-C…然后我犯了一个错误。我知道自己不知道。但是我怎么能在它周围移动呢?我尝试使用2-3个tut,但它们都假设obj-c方法没有在obj-c++类中调用 我的Obj-C++类(.mm文件) 赛后 sessionSta

你好,我知道这个问题已经讨论过好几次了,但我觉得没有其他解释适合我。也许这是不可能的,但是。。。目前我有MM文件,它看起来像(init方法/头文件)Obj-C,除了少数C++方法(库LIVE55,我用C++编写),我可以调用Obj-C的C++方法就好了。但是当我想在C++中调用Obj-C…然后我犯了一个错误。我知道自己不知道。但是我怎么能在它周围移动呢?我尝试使用2-3个tut,但它们都假设obj-c方法没有在obj-c++类中调用

我的Obj-C++类(.mm文件)

赛后

sessionState.sink->startPlaying(*sessionState.source, afterPlaying, (__bridge void*)self);
void afterPlaying(void* clientData) {
    [(__bridge NXVoiceSender*)clientData continueSendBuffer];
}

ObjuleC++不统一C++类和ObjuleC类。它允许你混合Objto-C代码和C++代码,但是这两个对象模型仍然是完全分离的——它基本上只使用C++,其中C将被用于正常Objo - C。C++中的“C++方法”实际上只是自由浮动函数,因为ObjuleC类定义不是C++中的特殊上下文。它们不是类的方法


您可能需要保留一个指向所讨论对象的指针,并将其放入
afterPlaying()
函数中(还需要使对象保持足够长的活动时间,以便在调用
afterPlaying()
时被引用)。我不熟悉这个库,但是
clientData
参数看起来很有前途。

startPlaying的第二个参数的类型是std::function?如果是这样,您可以将块而不是C++11 lambda传递给“C++11”,如下所示,将“C++语言方言”传递给“C++11”


给你的C++实现文件(或者至少一个带有通行证的“胶水”文件).mm文件名后缀。没有所谓的“目标C++方法”。你想要C++方法还是目标C方法?还有,为什么您希望在播放后将
作为C函数呢?这是mm文件,但当我尝试在播放后使用[self continueSendBuffer]时。使用未声明的标识符“self”。我将更新问题。在这种情况下,startPlaying的第二个参数是无效的:(不可能,您在播放第二个参数后传递了它。它不是无效的。我不知道放在哪里,所以我就把它放在这里。希望这能澄清它:)所以,将“afterPlayingFunc*afterFunc”更改为“std::function afterFunc”可能有用。很好地解释了Objective-C++的工作原理:)这很有效。
void afterPlaying(void* clientData) {
    [(__bridge NXVoiceSender*)clientData continueSendBuffer];
}
__weak testSender *self_ = self;
sessionState.sink->startPlaying(*sessionState.source, ^(void *){
    // We and stream and now I want check if it's some other streams to send so normaly I should call
    [self_ continueSendBuffer];
}, NULL);