gpt4 book ai didi

c++ - 调用纯虚方法

转载 作者:可可西里 更新时间:2023-11-01 15:40:37 25 4
gpt4 key购买 nike

编辑:已解决

我现在正在处理一个多线程项目,我有一个基工作类,以及从它继承的各种工作类。在运行时,工作类成为线程,然后根据需要执行工作。

现在,我有一个我编写的 Director,它应该维护一个指向所有 worker 的指针数组,以便它可以从他们那里检索信息,以及稍后修改其中的变量。

我通过创建一个指向基类指针的指针来做到这一点:

baseWorkerClass** workerPtrArray;

然后在 Director 的构造函数中,我动态地分配了一个指针数组给基本工作类:

workerPtrArray = new baseWorkerClass*[numWorkers];

在每个工作线程的构造函数中,工作线程调用导向器中的一个函数,该函数旨在将该工作线程的指针存储在数组中。

以下是 director 存储指针的方式:

Director::manageWorker(baseWorkerClass* worker)
{
workerPtrArray[worker->getThreadID()] = worker;
}

这是一个 worker 变体的例子。每个worker都继承自base worker类,base worker类包含应该存在于所有worker变体中的纯虚函数,以及一些在所有worker之间共享的变量。

class workerVariant : protected baseWorkerClass
{
public:

workerVariant(int id)
: id(id)
{
Director::manageWorker(this);
}

~workerVariant()
{
}

int getThreadID()
{
return id;
}

int getSomeVariable()
{
return someVariable;
}

protected:

int id;
int someVariable
};

然后 baseWorkerClass 看起来像这样:

class baseWorkerClass
{
public:

baseWorkerClass()
{
}

~baseWorkerClass()
{
}

virtual int getThreadID() = 0;
virtual int getSomeVariable() = 0;
};

在每个 worker 变体完成初始化后,我应该得到一个指向 baseWorkerClass 对象的指针数组。这意味着我应该能够,例如,使用它的 ID 作为数组的索引来获取某个 worker 中给定变量的值,如下所示:

workerPtrArray[5]->getSomeVariable(); // Get someVariable from worker thread 5

问题是这段代码导致 Windows 可执行文件崩溃,没有任何解释原因,在 Linux 中,它说:

pure virtual method called
terminate called without an active exception
Aborted

我可以发誓我在某个时候让这个工作正常,所以我对我搞砸了什么感到困惑。


有问题的实际未修改代码:

Worker 变体 header :http://pastebin.com/f4bb055c8
worker 变体源文件:http://pastebin.com/f25c9e9e3

基础 worker 类头:http://pastebin.com/f2effac5
基础 worker 类源文件:http://pastebin.com/f3506095b

导演标题:http://pastebin.com/f6ab1767a
导演源文件:http://pastebin.com/f5f460aae


编辑:额外信息,在 manageWorker 函数中,我可以从指针“worker”调用任何纯虚函数,它工作得很好。在 manageWorker 函数之外,当我尝试使用指针数组时,它失败了。

编辑:现在我想起来了,线程的入口点是 operator()。 Director 线程在 worker 之前创建,这可能意味着重载的括号运算符在被子类覆盖之前调用纯虚函数。我正在调查这个。

最佳答案

问题似乎是在 workerVariant 实例的构造函数中调用了 Director::manageWorker:

Director::manageWorker(baseWorkerClass* worker) {
workerPtrArray[worker->getThreadID()] = worker;
}

据推测,getThreadID() 不是纯虚函数,否则您会(希望如此!)得到关于未在 workerVariant 中覆盖它的编译器错误。但是 getThreadID() 可能会调用您应该覆盖的其他函数,但它们是在抽象类中调用的。您应该仔细检查 getThreadID() 的定义,以确保在正确初始化之前您没有做任何依赖于子类的不当行为。

更好的解决方案可能是将这种多阶段初始化分离到一个单独的方法中,或者设计 DirectorbaseWorkerClass 这样它们就没有这个某种初始化时间相互依赖性。

关于c++ - 调用纯虚方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2167335/

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