C++ &引用;缺少vtable“;对于析构函数,但定义了析构函数

C++ &引用;缺少vtable“;对于析构函数,但定义了析构函数,c++,compiler-errors,destructor,vtable,C++,Compiler Errors,Destructor,Vtable,我有一门课: class Optimizer { public: Optimizer(mongoc_client_t *dbClient, std::string strategyName, std::string symbol, int group); virtual ~Optimizer() = 0; 及其实施: #include "optimizers/optimizer.h" Optimizer::Optimizer(mongoc_client

我有一门课:

class Optimizer {
    public:
        Optimizer(mongoc_client_t *dbClient, std::string strategyName, std::string symbol, int group);
        virtual ~Optimizer() = 0;
及其实施:

#include "optimizers/optimizer.h"

Optimizer::Optimizer(mongoc_client_t *dbClient, std::string strategyName, std::string symbol, int group) {
    // ...
}

Optimizer::~Optimizer() {
    free(data);
}
但我发现以下错误似乎与析构函数未定义有关:

Undefined symbols for architecture x86_64:
  "typeinfo for Optimizer", referenced from:
      typeinfo for ReversalsOptimizer in reversalsOptimizer.o
  "vtable for Optimizer", referenced from:
      Optimizer::Optimizer(_mongoc_client_t*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, int) in optimizer.o
      Optimizer::~Optimizer() in optimizer.o
  NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [prepareData] Error 1
架构x86_64的未定义符号: “优化器的类型信息”,引用自: ReversalsOptimizer.o中ReversalsOptimizer的类型信息 “vtable for Optimizer”,引用自: 优化器中的优化器(_mongoc_client_t*,std::_1::basic_string,std::_1::basic_string,int) 优化器::~Optimizer()在Optimizer.o中 注意:缺少vtable通常意味着第一个非内联虚拟成员函数没有定义。 ld:找不到架构x86_64的符号 叮当声:错误:链接器命令失败,退出代码为1(使用-v查看调用) make:**[prepareData]错误1 我做错了什么?完整的头定义为,实现为


我还尝试将析构函数设置为非虚拟,但没有任何帮助。

问题正是错误消息所说的:

注意:缺少vtable通常意味着第一个非内联虚拟成员函数没有定义

具体来说,您声明并调用了此函数,但从未定义过此函数:

    virtual void prepareStudies();

问题正是错误消息所说的:

注意:缺少vtable通常意味着第一个非内联虚拟成员函数没有定义

具体来说,您声明并调用了此函数,但从未定义过此函数:

    virtual void prepareStudies();

将Optimizer类中的其他虚拟函数设置为纯虚拟函数解决了问题。

将Optimizer类中的其他虚拟函数设置为纯虚拟函数解决了问题。

因此,您将其设置为纯虚拟函数并提供了实现?请编辑您的帖子并包含.I在其他StackOverflow帖子中看到这是可以接受的。不过,我也尝试过将其设置为非纯虚拟的。好吧,要么您尝试实例化一个抽象基类,要么这不是您的全部代码,因为您将其设置为纯虚拟并提供了一个实现?请编辑您的帖子,并包括一个。我在其他StackOverflow帖子中看到,这是可以接受的。不过,我也试着让它成为非纯虚拟的,或者你想实例化一个抽象基类,或者这不是你的全部代码,因为