私はいくつかのコードを書きましたが、それをコンパイルすることができません:
#include <cstdio>
#include <vector>
名前空間stdを使用します。
クラスビジター;
クラスランド{
公衆:
virtual void 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 <Land> * l;
公衆:
明示的なTrip(vector <Land> * _l);
void accept(Visitor * v);
};
/ ** /
void Visitor :: visit(const England * e)const {
printf( "ねえ、イギリスだ!\ n");
}
void Visitor :: visit(const Russia * r)const {
printf( "ねえ、それはロシアです!\ n");
}
void Russia :: accept(const Visitor * v){
v-> visit(this);
}
void England :: accept(const Visitor * v){
v-> visit(this);
}
Trip :: Trip(vector <Land> * _l):l(_l){}
void Trip :: accept(Visitor * v){
for(unsigned i = 0; i <l-> size(); i ++){
l-> at(i).accept(v);
}
}
int main(){
イングランドイングランド;
ロシアロシア;
vector <Land> trip_plan;
trip_plan.push_back(england);
trip_plan.push_back(ロシア);
trip_plan.push_back(england);
トリップ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:関数 `Land :: Land()'内: vp.cc:(。text._ZN4LandC2Ev[Land:: Land()] + 0xf):「vtableforLand」への未定義の参照 /tmp/ccNanCPR.o:関数 `Land :: Land(Land const&)': vp.cc:(.text._ZN4LandC1ERKS_ [Land :: Land(Land const&)] + 0x13):「vtableforLand」への未定義の参照 /tmp/ccNanCPR.o:関数 `Land ::〜Land()': vp.cc:(。text._ZN4LandD1Ev[Land::〜Land()] + 0xf):「vtableforLand」への未定義の参照 /tmp/ccNanCPR.o:(.rodata._ZTI6Russia[ロシアのtypeinfo]+0x10):「Landのtypeinfo」への未定義の参照 /tmp/ccNanCPR.o:(.rodata._ZTI7England [typeinfo for England] + 0x10): `typeinfoforLand'への未定義の参照 collect2:ldが1つの終了ステータスを返しました
この質問は、宣言の循環依存に基づいています