Я, видимо, был не прав, говоря, что этимология не может мешать в данной ситуации, потому что она явно вам мешает осознать точное значение слова «преступление» — оно несколько уже, чем значения слова «злодеяние», или выражения «переступание через запретную линию».
Попробуйте для тренировки упражнение:
Возьмите фразу «было совершено преступление» и попробуйте менять слово преступление на что-то другое. Например если сказать «был нарушен закон», то значение фразы останется прежним в среднестатистическом контексте. А вот если сказать «было совершено злодеяние», или, прости господи, «была переступлена запретная линия», то фразы смысл будет совершенно утерян, и выражение станет достойным только речи дьякона из сельской церкви.
Понятие преступления, а тем более схожие по смыслу понятия могут существовать и без государства, однако классифицировать то, или иное действие как преступление становится возможным после того, как мы определили по какому законодательству будет это решаться.
Этимология тут не может мешать, так как она не причем. Дело в значении слова: не может существовать преступность до тех пор пока не образовалось государство и не сказало, что считать преступлением, а что не считать.
Нет позвольте, преступность — это просто термин и пока никто не придумал определения для преступности, то логично, что никакой преступности не существовало. Когда вы говорите про мафиози, вы сначала придумали себе критерии по которым вы причисляете к ним людей («гражданин является мафиози, то есть состоит в преступном сообществе»), а потом оказывается, что один человек — мафиози, а другой нет. Иначе получается игра в мафию — вы выбираете мафиози, а потом придумываете почему
Написал этот код я просто из спортивного интереса, а статью решил написать после прочтения этой ветки обсуждения статьи, также посвященной сериализации, решив, что кому-нибудь это покажется любопытным.
void serialize (iSerializable*& object, const wstring& name)
{
if (!object) m_factory->get_object (object, m_node.find_child_by_attribute (L«name», name.c_str ()).name ());
object->serialize (get_node_by_attr (name));
}
— собственно пример использования из статьи.
Что касается ресурсов, то если конструктор класса по умолчанию создает объекты в динамической памяти, то это поле должно быть перезадано в полученном таким образом объекте.
Предполагается, что если мы используем для создания объектов класса PrototypeFactory, то мы должны обеспечить ему простой конструктор, не создающий ресурсов, и все данные будем вводить в объект после получения его из PrototypeFactory. Естественно в этом случае выделять память в конструкторе по умолчанию бессмысленно, так как она будет лежать в прототипе безо всякой пользы.
Применение malloc/realloc оправдано, там где это нужно (свои аллокаторы, еще какие-то нужды). В данном коде необходимость malloc'a мне не ясна. Более того, судя по всему вы выделяете память под произвольный тип T и «инициализируете» его неким прототипом с помощью memcpy, а что если тип T не является trivially-copyable (например он строка, или любой другой тип, владеющий какими-то динамическими ресурсами)? Или десериализация нетривиальных типов не предполагалась?
При десериализации объекта мы, зная имя класса этого объекта, должны будем получить участок памяти равный размеру объекта этого класса. В PrototypeFactory мы его и получим. Естественно это будет точная копия объекта, созданного конструктором по умолчанию. Остальную работу по наполнению его содержимым должен будет проделать объект, получивший этот участок памяти.
Попробуйте для тренировки упражнение:
Возьмите фразу «было совершено преступление» и попробуйте менять слово преступление на что-то другое. Например если сказать «был нарушен закон», то значение фразы останется прежним в среднестатистическом контексте. А вот если сказать «было совершено злодеяние», или, прости господи, «была переступлена запретная линия», то фразы смысл будет совершенно утерян, и выражение станет достойным только речи дьякона из сельской церкви.
{
if (!object) m_factory->get_object (object, m_node.find_child_by_attribute (L«name», name.c_str ()).name ());
object->serialize (get_node_by_attr (name));
}
— собственно пример использования из статьи.
Что касается ресурсов, то если конструктор класса по умолчанию создает объекты в динамической памяти, то это поле должно быть перезадано в полученном таким образом объекте.
Предполагается, что если мы используем для создания объектов класса PrototypeFactory, то мы должны обеспечить ему простой конструктор, не создающий ресурсов, и все данные будем вводить в объект после получения его из PrototypeFactory. Естественно в этом случае выделять память в конструкторе по умолчанию бессмысленно, так как она будет лежать в прототипе безо всякой пользы.
Но в таком случае мы не сможем изменить значение данных класса при десериализации.
При десериализации объекта мы, зная имя класса этого объекта, должны будем получить участок памяти равный размеру объекта этого класса. В PrototypeFactory мы его и получим. Естественно это будет точная копия объекта, созданного конструктором по умолчанию. Остальную работу по наполнению его содержимым должен будет проделать объект, получивший этот участок памяти.
Хотелось бы узнать поподробнее, чем плохи wide-литералы, и как Вы бы предпочли сериализовать/десериализовать встроенные типы?
А как Вам вызов malloc в PrototypeFactory?