Многосайтовое выполнение: избавление от виртуальной таблицы с наследованием (устаревший код) - PullRequest
0 голосов
/ 08 сентября 2011

Я застрял на некоторое время над этой проблемой, и мне нужна ваша помощь.

Мое приложение 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 ]

2 голосов
/ 08 сентября 2011

Если вы просто хотите избавиться от виртуальных таблиц, вам не нужно избавляться от наследования. Вы должны избавиться от виртуальных функций. Глядя на код, который вы публикуете, возможно, вы сможете внести несколько изменений, чтобы getSize и getBuffer были в GenericList, чтобы вы могли сделать их не виртуальными, но это действительно зависит от остальной части вашего кода.

Первый вопрос, однако, зачем вам беспокоиться о виртуальных таблицах? Когда вы сериализуете объекты, вы должны сериализовать их данные, чтобы сохранить их состояние, и это единственное состояние, которое вы должны передать.

1 голос
/ 08 сентября 2011

Я думаю, что вы обвиняете не ту часть проблемы ... если у вас распределенная система, вы должны убедиться, что сериализованные данные, отправляемые по проводам, содержат достаточно информации, чтобы восстановить состояние объекта. на другом конце соединения.

Я полагаю, что проблема, с которой вы сталкиваетесь, заключается в том, что вы отправляете необработанные данные по сети, в то время как у вас должен быть механизм сериализации, способный кодировать фактический тип отправляемого объекта и перестраивать объект на противоположном конце. с точно таким же типом. В случае объекта, принадлежащего классу с виртуальными функциями, это будет означать, что два объекта не равны поразрядно , так как на каждом конце соединения указатель на виртуальную таблицу будет ссылаться на другое местоположение в памяти, но они будут семантически равными, что необходимо для обработки объектов на другом конце.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...