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

时间:2014-07-07 16:08:47

标签: c++ objective-c grand-central-dispatch objective-c++

我正在尝试在(GCD)队列周围编写包装器。

我在头文件中有这样的内容

#include <dispatch/dispatch.h>

namespace myspace {

class Queue 
{

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

标题的对应部分是.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

2 个答案:

答案 0 :(得分:1)

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

如果myspace是一个'cpp'(纯C ++)文件,而Queue是一个'mm'(ObjC ++)文件,则在传递“分发”对象时会遇到跨语言障碍的链接器故障,因为它们是ObjC ++中的NSObject。 / p>

将双方都更改为“ .mm”,它将解决链接器问题。

答案 1 :(得分:0)

添加以下行:

namespace myspace {
....
}

执行

Queue::....