未定义对“ vtable for”的引用

时间:2018-12-26 17:28:04

标签: c++ vtable

因此,这是一个更大的项目的一部分。我有3个不同的文件。第一个是上一个项目中的类,该类仅用作类型(visitor.h),所以我不会包含它,因为我知道它可以工作。然后,我写了一个抽象类和另一个从space.h中第一个继承的抽象类,如下所示:

function myFunc(id) {
  print("myFunc: got " + id);
  return db.foo.findOne({_id: id});
}

db.foo.aggregate([
{$match: { _id: ObjectId(s_oid1) }}
,{$addFields: {qq: myFunc("$_id")}}
                ]);

现在在我的班上。我有几个班和错误:

class space{

public:
    virtual int get_vis_count() const = 0;
    virtual int __enter(Visitor *v) = 0;
    virtual int search(Visitor *v) = 0;
    virtual Visitor* __exit(int index) = 0;
    virtual void print() const = 0;
    virtual ~space() { };

};

class capped_space: public space{

    public:
    virtual int get_capacity() const = 0;
    virtual int has_space() const = 0;
};

流行。 classes.h:

classes.o: In function `office::office(building*, int, int)':
classes.cpp:(.text+0x8fe): undefined reference to `vtable for office'
classes.o: In function `office::~office()':
 classes.cpp:(.text+0xe1a): undefined reference to `vtable for  office'

classes.cpp:

class office:public capped_space{

private:
int office_number, No;
int  current_visitors;
int _f;
vector<Visitor*> visitors;

public:
office(building *b, int on, int m);
int get_capacity() const;
int has_space() const;
int get_vis_count() const;
int get_numb() const;
int __enter(Visitor * visitor);
int search(Visitor *v);
Visitor* __exit(int index);
Visitor* done();
void print() const;
~office();
};

第二个错误出现在教室地板的功能中,但我希望如果我发现办公室错误,我也将找出地板的错误。

如果需要更多代码,请发表评论,我会进行编辑。

P.S。如果我可能落伍了,请忽略。该代码本来是处理指针数组的,但现在我试图使其处理指针向量,以便可能会有一些剩余的检查

1 个答案:

答案 0 :(得分:0)

您缺少在office中声明的某些虚拟方法的定义,即searchget_capacity

结果是,编译器无法为office类生成虚拟函数表,因为它没有将这些虚拟函数放在其中的地址。因此出现“非常有用”的错误消息,因为从编译器的角度来看,问题在于虚拟表丢失了,而不是为什么丢失了。