Разработка в 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
) это в рабочем потоке после того, как вы закончите с этим.
Еще одно замечание: вам нужно заблокировать доступ к очереди, если родитель может ставить в очередь задание во время работы работника.
Ошибка означает, что объект, на который указывает p
в точке вызова имеет тип Parent
, Как это получилось, зависит от кода, который вы не показали.