DCTCP项目中由于需要在red-queue.cc中对ipv4-header.cc操作。其中red-queue.cc位于network模块,ipv4-header位于Internet模块,且internet模块依赖于network模块。在编译的时候,项目顺利通过,但是链接时出现错误undifine prefene to Ipv4Header::GetTos()。
跟大神同学讨论了后觉得可能是由于Internet模块依赖于network模块,导致编译器先对network操作,然而red-queue.cc又对Internet内部的ipv4-header.cc进行访问,所以编译器报错undifine prefene to Ipv4Header::GetTos()。
解决方案:将Ipv4Header::GetTos()定义为虚函数,并且为Ipv4Header定义一个父类Header(我这边项目里存在header.cc/header.h文件),Header里面也定义并简单实现虚函数。
virtual uint8_t GetTos(){ //Header中只是简单实现即可,
return 0;
}
当red-queue.cc中再次调用GetTos()时,会形成动态绑定,直到运行时才确定调用的哪个对象的GetTos(),从而避免链接时报错。