Неопределенная ссылка на виртуальную таблицу, конструктор и деструктор

У меня проблемы с конструктором и деструктором некоего многозадачного кода, над которым я работаю. Я получаю ошибку

task.o: In function `$_4Task':
/home/luke/project/task.cc(.text+0x57): undefined reference to `Task virtual table'
task.o: In function `_4TaskUi':
/home/luke/project/task.cc(.text+0x5): undefined reference to `Task virtual table'

если взглянуть на объектный файл, то похоже, что имена разыменования _4Task и _4TaskUi являются моими деструктором и конструктором Task соответственно. Кажется, я не могу понять, почему мой компилятор говорит мне, что я не ссылался на виртуальную таблицу. Любая помощь будет принята с благодарностью, я использую GCC на Ubuntu 12.10

ниже мой заголовочный файл

#ifndef TASK
#define TASK

#include "stddef.h"#include "nocopy.h"
class Task: private NoCopy
{
void** stack;           //Base of stack
void** sp;              //saved sp when not running

static Task* current;               //Point to running task
static void start();                //calls task::main
static void dispatch(Task* t);      //switch context to task t
virtual void main();
friend class TaskList;

protected:
void fork();            //start task

public:
Task(size_t stackSize);
virtual ~Task();
static Task* const getCurrent()
{
return current;
}
static void yield();
};

#endif

и ниже мой файл cpp

#include "task.h"
Task initialTask(0);                //initial code before
// set up stack in crt0.s
Task* Task::current = &initialTask;         //note first running task
TaskList readyList;
Task::Task(size_t stackSize)
:stack(new (void*)[stackSize/sizeof(void*)]),
sp(&stack[stackSize/sizeof(void*)])
{                               //set up task stack
if(stackSize)
{
*--sp = 0;      //for debugger
*--sp = 0;      //terminate frame chain
*--sp = &start; //point to first code
}
}

Task::~Task()
{
delete[](stack);
}
//Contec Switching
register void** spreg asm("s");     //can refer to hc12 SP as spreg
void Task::dispatch(Task* task)
{
current -> sp = spreg;
current = task;
spreg = current -> sp;
}//Dispatch is called by one task but is returned by another

void Task::fork()       //call in ctor of all task
{
TaskList::Node node(&readyList);    //Make caller go from "running"->"ready"dispatch(this);                 //Start new task
}

void Task::start()
{
current -> main();
TaskList forever;       //Wait Task
forever.enqueue();      //Wait forever
}

РЕДАКТИРОВАТЬ Я понял это, поскольку все говорили, что main не был определен ни в task.h, ни в task.cc, main is зависит от задачи, поэтому определение main по умолчанию будет

virtual void main(){};

1

Решение

Вы должны предоставить определения для всех virtual функции в вашем классе. Только чисто виртуальные функции могут существовать без определения. Код, который вы показываете, не имеет никакого определения для функции Task::main(), Вы должны определить это.
Если подумать, я бы назвал эту функцию более подходящей.


Хорошо для чтения:

Что это означает, что «виртуальная таблица» является неразрешенным внешним?

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]