多站点执行:删除带有继承的虚拟表(遗留代码)

时间:2011-09-08 09:45:06

标签: c++ arrays pointers inheritance virtual

我已经在这个问题上停留了一段时间,我需要你的帮助。

我的C ++应用程序在多个exec站点上运行。我的问题是我无法传递持有虚拟表的对象,因为站点不共享内存(因此来自给定对象的虚拟方法将导致未定义的行为)。通过“我无法通过”我的意思是:我不想要任何虚拟桌子。

有趣的是,不仅有继承,还有模板和怪异的概念......

这是代码

// "Main" code
List< Animals, 5 > list;
List< Animals, 8 > list2;
list.concatenate( list2 );

// GenericList.hpp
template< Type >
class GenericList 
{
 virtual getBuffer(void) = 0;
 virtual getSize(void) = 0;
 void concatenate( GenericList<Type> gList)
 {
  int size = gList.getSize(); // Call to the child...
  ...getBuffer()...
  // processing, etc.
 }
}

// List.hpp
template< Type, Size_ >
class List : public GenericList< Type >
{
 int getSize()
  {
   return Size_;
  }
 Type * getBuffer()
  {
   return buffer;
  }
 Type buffer[Size_];
}

如何摆脱遗产?

编辑/根据前几个答案,我可以告诉你,我不能实现更好的序列化,代码是私有的。

2 个答案:

答案 0 :(得分:2)

如果你只是想摆脱虚拟表,你不必摆脱继承。你必须摆脱虚拟功能。查看您发布的代码,也许您可​​以进行一些更改,以便getSizegetBuffer位于GenericList,这样您就可以将它们设为非虚拟,但这实际上取决于其余的代码。

然而,第一个问题是,您为什么要首先担心虚拟表?序列化对象时,应该序列化它们的数据以保留它们的状态,并且状态是你应该传递的唯一内容。

答案 1 :(得分:1)

我认为你在那里指责问题的错误部分......如果你有一个分布式系统,你必须确保在线路上发送的序列化数据包含足够的信息来重建对象的状态在连接的另一端。

我相信您遇到的问题是您通过网络发送原始数据,而您应该有一个序列化机制,能够编码正在发送的对象的实际类型,并在另一端重建对象具有完全相同的类型。对于属于具有虚函数的类的对象,这意味着两个对象不等于按位,因为在连接的每一端,指向vtable的指针将引用不同的在内存中的位置,但它们语义相等,这是你需要能够处理另一端的对象。