我写了一些代码,但无法编译它:

#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/

10-11 02:42