Частично простые старые данные

Многие вопросы говорят о POD; Но все вопросы говорят о полной копии объекта. Могу ли я применить ту же концепцию к простой старой части данных класса. Пример:

struct Parent1
{
int x;
float y;
};

struct Parent2
{
int k;
float l;
};

struct NotPod : public Parent1, public Parent2
{
char z;
short w;
};

NotPod a, b;

void func()
{
a.z = '4';
a.w = 345;
memcpy((char*)&b.z, (char*)&a.z, (char*)(&a.w)-(&a.z) + sizeof(a.w));
}

Я спрашиваю о старом C ++ (не C ++ 11).

1

Решение

Как я понял из вашего примера кода, ваш вопрос не о POD. Что вам нужно, так это гарантия того, что члены вашего самого производного класса являются агрегатами и имеют непрерывную структуру памяти.

См. 9.2.12 (ISO 14882: 2003).

Нестатические члены данных (не объединяющего) класса, объявленного без промежуточного спецификатора доступа, распределяются
так что более поздние члены имеют более высокие адреса в объекте класса. Порядок выделения нестатических
члены данных, разделенные спецификатором доступа, не определены (11.1).

Проще говоря, не ставьте public/protected/private Получите доступ к спецификаторам между вашей последовательностью агрегатов, и вы получите такую ​​гарантию.

2

Другие решения

Таким образом, вы хотите скопировать только элементы родительской части в структуре.
Если да, то почему бы не реализовать как в func3 ()?

void func2()
{
a.z = '7';
a.w = 444;
a.x = 4;
a.y = 2.1;
memcpy(&b, &a, sizeof(NotPod)); // copies all the members
}

void func3()
{
a.z = '7';
a.w = 444;
a.x = 4;
a.y = 2.1;
memcpy(&b, &a, sizeof(Parent)); // copies only the members of the Parent
}
0

Как вы сами сказали, это не POD в C ++ 03. Части этого (Parent1 и Parent2), но вы хотите рассматривать остальное как POD. Ну, просто сделай остальное POD. Либо путем определения локальной структуры

struct NotPod : public Parent1, public Parent2
{
struct InternalPod
{
char z;
short w;
};
InternalPod i;
};

или путем наследования от третьей структуры:

struct InternalPod
{
char z;
short w;
};

struct NotPod : public Parent1, public Parent2, public InternalPod
{
};
0
По вопросам рекламы [email protected]