gpt4 book ai didi

c++ - dispatch_queue_t 作为 C++ 类中的实例变量

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:53:14 26 4
gpt4 key购买 nike

我正在尝试写一个 包装 (GCD) 队列。

在头文件中是这样的

#include <dispatch/dispatch.h>

namespace myspace {

class Queue
{

public:
Queue(dispatch_queue_t dispatchQueue);
private:
dispatch_queue_t dispatchQueue_;
}
}

header 的对应部分是带有实现的 .mm 文件。

我将 Queue.h 导入其他一些纯 C++ 文件,在链接时我得到:

Undefined symbols for architecture armv7:
"myspace::Queue::Queue(dispatch_queue_s*)", referenced from:
myspace::NiceClass::CreateOneMoreQueue() in NiceClass.o

在 NiceClass 中我创建了一个新队列:

Queue *queue = new Queue(dispatch_get_main_queue());

我被这个困住了。好像我不能这样做。我可以将 dispatch_queue_t 更改为 void* 并且它可以像这样工作,但是我丢失了类型信息并得到了很多强制转换。

我将不胜感激。

编辑:这是 Queue.mm 中的实现。内存管理和其他细节省略。

Queue::Queue(dispatch_queue_t dispatchQueue) 
{
dispatchQueue_ = dispatchQueue;
if (dispatchQueue_ == NULL) {
dispatchQueue_ = dispatch_get_main_queue();
}
}

void Queue::AddMessage(Handler *handler, Context *context)
{
Message *msg = new Message;
msg->phandler = handler;
msg->context = context;
dispatch_async(dispatchQueue_, ^{
handler->ProcessMessage(msg);
});
}

EDIT2:这是一个对我来说失败的测试项目 zip 32k

最佳答案

哇! 5年前!对于现在偶然发现的任何人!

如果 myspace 是一个“cpp”(纯 C++)文件,而 Queue 是一个“mm”(ObjC++)文件,那么在传递“dispatch”对象时,由于它们是 ObjC++ 中的 NSObject,您将遇到跨语言障碍的链接器失败。

将两边都更改为“.mm”,它应该可以解决链接器问题。

关于c++ - dispatch_queue_t 作为 C++ 类中的实例变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24615035/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com