我写了一些代码,但无法编译它:
#include
#include
使用命名空间std;
类访问者;
土地类{
上市:
虚拟虚空accept(const Visitor * v);
};
英格兰类别:公共土地{
上市:
void accept(const Visitor * v);
};
俄罗斯类别:公共土地{
上市:
void accept(const Visitor * v);
};
类访问者{
上市:
void visit(const England * e)const;
void visit(const Russia * r)const;
};
班级旅行 {
私人的:
vector * l;
上市:
显式Trip(vector * _l);
无效accept(访问者* v);
};
/ ** /
无效的Visitor :: visit(const England * e)const {
printf(“嘿,这是英国!\ n”);
}
无效的Visitor :: visit(const Russia * r)const {
printf(“嘿,是俄罗斯!\ n”);
}
无效的俄罗斯::: accept(const Visitor * v){
v-> visit(this);
}
无效的英格兰::: accept(const Visitor * v){
v-> visit(this);
}
Trip :: Trip(vector * _l):l(_l){}
无效Trip :: accept(Visitor * v){
for(无符号i = 0; i size(); i ++){
l-> at(i).accept(v);
}
}
int main(){
英国英格兰;
俄罗斯俄罗斯;
vector trip_plan;
trip_plan.push_back(英国);
trip_plan.push_back(俄罗斯);
trip_plan.push_back(英国);
旅行my_trip(&trip_plan);
拜访我;
my_trip.accept(&me);
返回0;
}
这是我从g ++得到的:
C ++ -ansi -Wall -Wextra -Wconversion -pedantic -Wno-unused-parameter -o vp vp.cc
/tmp/ccNanCPR.o:在函数“土地::土地()”中:
vp.cc:(.text._ZN4LandC2Ev[Land::Land()]+0xf):对“ vtable for Land”的未定义引用
/tmp/ccNanCPR.o:在函数`Land :: Land(Land const&)'中:
vp.cc:(.text._ZN4LandC1ERKS_[Land::Land(Land const&)] + 0x13):未定义对“ vtable for Land”的引用
/tmp/ccNanCPR.o:在函数`Land ::〜Land()'中:
vp.cc:(.text._ZN4LandD1Ev[Land::~Land()]+0xf):对“ vtable for Land”的未定义引用
/tmp/ccNanCPR.o :(。rodata._ZTI6Russia [俄罗斯的typeinfo] + 0x10):未定义参考“土地的typeinfo”
/tmp/ccNanCPR.o :(。rodata._ZTI7England [英格兰的类型信息] + 0x10):未定义参考“土地的类型信息”
collect2:ld返回1退出状态
该问题基于Circular dependencies of declarations
最佳答案
我已经在那里answered了。
vtable实例化的规则在编译器文档中进行了说明。
在这里,等待查看Land :: accept的定义(主体),您将其定义为非纯虚函数,但从未定义。
要么定义它,要么使其完全是虚拟的。
关于c++ - 虚拟表未定义,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1748827/