gpt4 book ai didi

c++ - 对虚拟表、构造函数和析构函数的 undefined reference

转载 作者:行者123 更新时间:2023-11-30 02:56:18 26 4
gpt4 key购买 nike

我在处理我正在处理的一些许可多任务代码的构造函数和析构函数时遇到了问题。我收到的错误是

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 的取消引用名称分别是我的任务析构函数和构造函数。我似乎无法弄清楚为什么我的编译器告诉我我没有引用虚拟表。任何帮助将不胜感激,我在 ubuntu 12.10 上使用 GCC

下面是我的头文件

#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 取决于任务,所以 main 的默认定义是

virtual void main(){};  

最佳答案

您需要为您的类中的所有虚拟 函数提供定义。只有纯虚函数可以在没有定义的情况下存在。您显示的代码没有函数 Task::main() 的任何定义。你需要定义它。
再三考虑,我会将该函数命名为更合适的名称。


好读:

What does it mean that the "virtual table" is an unresolved external?

关于c++ - 对虚拟表、构造函数和析构函数的 undefined reference ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15727315/

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