2013-03-17 2 views
1

Многие вопросы говорят о 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).

+0

Это довольно ужасный способ написания 'b.z = a.z;'. – Thomas

+0

@ Томас, на самом деле это не b.z = a.z; b.w = a.w; :). И, кстати, это просто для упрощения вопроса. На самом деле я пишу библиотеку вызовов вызовов. – Yousf

+1

Каким образом 'NotPod' не POD? –

ответ

2

Как я понял из вашего образца кода, ваш вопрос не о стручках. Вам нужна гарантия того, что члены вашего самого производного класса являются агрегатами, и они имеют непрерывный макет памяти.

См 9.2.12 (ISO 14882: 2003)

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

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

0

Таким образом, вы хотите скопировать элементы родительской части в структуру. Если да, почему бы не реализовать, как в 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, который зависит от реализации. – Yousf

0

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

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

Я думаю, что NotPod все еще не POD, его нельзя скопировать, и я не могу его скопировать. – Yousf

+0

А? Вы хотели скопировать z и w. Теперь они находятся в POD. – Rumburak

Смежные вопросы