对 'vtable for' 的未定义引用
undefined reference to 'vtable for'
所以这是一个更大项目的一部分。我有 3 个不同的文件。第一个是以前项目中的 class,它只是用作类型 (visitor.h),所以我不会包括它,因为我知道它有效。然后我写了一个摘要 class 和另一个摘要 class 继承自 space.h 中的第一个摘要,如下所示:
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 和错误:
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.h:
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();
};
classes.cpp:
office::office(building *b, int on, int m): office_number(on), current_visitors(0), _f(m){
No = b->get_space_size('o');
cout << "Office number: " << office_number << "\thas been created\n";
}
int office::get_vis_count() const{
return current_visitors;
}
int office::has_space() const{
return (current_visitors < No);
}
int office::get_numb() const{
return office_number;
}
int office::__enter(Visitor * visitor){
if(visitor == NULL) return -1;
if(has_space()){
if(!visitor->__done()){
if((visitor->get_office() == office_number)){
visitors.push_back(visitor);
cout << "Entering office " << _f << "-" << office_number << "\t: ";
visitors[current_visitors]->print_v();
current_visitors++;
return 1;
}else{
return 0;
}
}else{
return 1;
}
}else{
cout << "Please, wait outside for entrance in office number: " << office_number << endl;
return 0;
}
}
Visitor* office::__exit(int index){
if (visitors[index]->__done()){
Visitor *nav;
nav = visitors[index];
visitors.erase(visitors.begin() + index);
current_visitors--;
return nav;
}else{
return NULL;
}
}
Visitor* office::done(){
if(current_visitors){
int random;
random = rand() % current_visitors;
visitors[random]->__set_done();
cout << "Exiting office " << _f << "-" << office_number << "\t: ";
visitors[random]->print_v();
return __exit(random);
}else{
return NULL;
}
}
void office::print() const{
if(current_visitors != 0){
cout << "Floor: " << _f << endl;
cout << "Office: " << office_number << endl;
for (int i = 0; i < No; i++)
{
visitors[i]->print_v();
}
cout << endl;
}
}
office::~office(){
cout << "End of the work!\n";
}
第二个错误出现在 class floor 的函数中,但我希望如果我找出办公室错误,我也能找出 floor 的函数。
如果需要更多代码,请发表评论,我会进行编辑。
P.S。请忽略我可能留下的一些如果。代码最初是处理指针数组,现在我试图让它处理指针向量,所以可能会有一些剩余检查
您缺少在 office
中声明的某些虚拟方法的定义,即 search
和 get_capacity
。
因此,编译器无法为 office
class 生成虚函数 table,因为它没有放置这些虚函数的地址。因此出现 "very useful" 错误消息,因为从编译器的角度来看,问题是虚拟 table 丢失了,而不是 为什么 丢失了。
所以这是一个更大项目的一部分。我有 3 个不同的文件。第一个是以前项目中的 class,它只是用作类型 (visitor.h),所以我不会包括它,因为我知道它有效。然后我写了一个摘要 class 和另一个摘要 class 继承自 space.h 中的第一个摘要,如下所示:
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 和错误:
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.h:
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();
};
classes.cpp:
office::office(building *b, int on, int m): office_number(on), current_visitors(0), _f(m){
No = b->get_space_size('o');
cout << "Office number: " << office_number << "\thas been created\n";
}
int office::get_vis_count() const{
return current_visitors;
}
int office::has_space() const{
return (current_visitors < No);
}
int office::get_numb() const{
return office_number;
}
int office::__enter(Visitor * visitor){
if(visitor == NULL) return -1;
if(has_space()){
if(!visitor->__done()){
if((visitor->get_office() == office_number)){
visitors.push_back(visitor);
cout << "Entering office " << _f << "-" << office_number << "\t: ";
visitors[current_visitors]->print_v();
current_visitors++;
return 1;
}else{
return 0;
}
}else{
return 1;
}
}else{
cout << "Please, wait outside for entrance in office number: " << office_number << endl;
return 0;
}
}
Visitor* office::__exit(int index){
if (visitors[index]->__done()){
Visitor *nav;
nav = visitors[index];
visitors.erase(visitors.begin() + index);
current_visitors--;
return nav;
}else{
return NULL;
}
}
Visitor* office::done(){
if(current_visitors){
int random;
random = rand() % current_visitors;
visitors[random]->__set_done();
cout << "Exiting office " << _f << "-" << office_number << "\t: ";
visitors[random]->print_v();
return __exit(random);
}else{
return NULL;
}
}
void office::print() const{
if(current_visitors != 0){
cout << "Floor: " << _f << endl;
cout << "Office: " << office_number << endl;
for (int i = 0; i < No; i++)
{
visitors[i]->print_v();
}
cout << endl;
}
}
office::~office(){
cout << "End of the work!\n";
}
第二个错误出现在 class floor 的函数中,但我希望如果我找出办公室错误,我也能找出 floor 的函数。
如果需要更多代码,请发表评论,我会进行编辑。
P.S。请忽略我可能留下的一些如果。代码最初是处理指针数组,现在我试图让它处理指针向量,所以可能会有一些剩余检查
您缺少在 office
中声明的某些虚拟方法的定义,即 search
和 get_capacity
。
因此,编译器无法为 office
class 生成虚函数 table,因为它没有放置这些虚函数的地址。因此出现 "very useful" 错误消息,因为从编译器的角度来看,问题是虚拟 table 丢失了,而不是 为什么 丢失了。