gpt4 book ai didi

c++ - 使用队列进行对象切片

转载 作者:太空狗 更新时间:2023-10-29 21:46:31 25 4
gpt4 key购买 nike

在 Ubuntu 上使用 Eclipse/gcc 和 -std=c++0x 进行开发。

我似乎遇到了对象切片问题,这不属于我在这里看到的其他问题。我有一个非常简单的基类/子类继承模型。基类有一个纯虚函数,显然子类实现了:

class Parent{
public:
Parent();
virtual ~Parent();
virtual void DoStuff() = 0;
};

class Child : public Parent{
public:
Child();
virtual ~Child();
virtual void DoStuff(); //Child can have "grandchildren"
};

我想要的是有一个队列,我可以在其中存储这些对象以供工作线程处理。我知道我应该存储指针,否则我会保证切片。因此,在执行此操作的类(“处理器”)中,我有:

typedef queue<Parent*> MYQUEUE; //#include <queue>
static MYQUEUE myQueue;

//Call this after creating "Child c;" and passing in &c:
void Processor::Enqueue(Parent* p)
{
myQueue.push(p);
}

void* Process(void* args) //function that becomes the worker thread
{
while(true)
{
if(!myQueue.empty())
{
Parent* p = myQueue.front();
p->DoStuff();
myQueue.pop();
}
}
return 0;
}

然后发生的是程序崩溃,说“调用了纯虚方法”,就好像继承/多态性没有正常工作一样。我知道继承设置正确,因为在我测试时我确认这是有效的:

Child c;
Parent* p = &c;
p->DoStuff();

非常感谢任何指导!

最佳答案

如果将对象传递给工作线程,则不能在堆栈上创建它。当工作线程调用它时,父线程可能已经离开该函数并销毁了该对象。您需要在父线程中动态分配(可能通过 new)它,并且只有在完成后才在工作线程中释放(delete)它。

另外请注意,如果父级能够在工作进程运行时将作业排入队列,则需要锁定队列访问。

关于c++ - 使用队列进行对象切片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14963057/

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