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



我在这个问题上卡住了一段时间,我需要你的帮助。

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

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

代码

// "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_];
}

如何摆脱继承

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

如果您只是想要删除虚拟表,则不必删除继承。你必须摆脱虚函数。看看你发布的代码,也许你可以做一些改变,使getSizegetBufferGenericList中,所以你可以使它们非虚拟,但这真的取决于你的代码的其余部分。

然而,第一个问题是,为什么要担心虚拟表呢?当您序列化对象时,您应该序列化它们的数据以保持它们的状态,并且状态是您唯一应该传递的东西。

我认为你把问题归咎于错误的部分。如果您使用的是分布式系统,则必须确保在网络上发送的序列化数据包含足够的信息来重建连接另一端对象的状态。

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

最新更新