2014-02-20 3 views
0

Я начинаю с помощью следующего кода:Как изолировать данные (сериализация) производного класса?

#include <iostream> 

class Base 
{ 
private: 
    char a[4]; 
public: 
    Base(void){memcpy(a, "Base", 4);} 
    ~Base(void){} 
}; 

class Derived : 
    public Base 
{ 
private: 
    char b[8]; 
public: 
    Derived(void){ memcpy(b, "Derived", 8);} 
    ~Derived(void){} 
}; 

Чтобы извлечь данные из базового класса я хотел бы сделать следующее:

int main(void) 
{ 
    Derived derived; 

    char* onlyBase = new char[sizeof(Base) + 1];//+1 for '\0' 
    memcpy(onlyBase, &static_cast<Base>(derived), sizeof(Base)); 
    onlyBase[sizeof(Base)] = '\0'; 

    std::cout << onlyBase; 
} 

Как я могу получить данные только производную часть класса ?

+0

Почему вы пишете что-то настолько громоздкое и бессмысленное? Разумеется, 'sizeof (static_cast (производный)) + 1' просто' sizeof (Base) + 1'? И вместо 'memcpy' вы могли бы просто написать': a {'b', 'a', 's', 'e'} '. И вам не нужно '(void)', просто '()' будет делать. –

+0

Ну, да. Я отредактирую это. '(Void)' был создан моей IDE, а «memcpy» легче редактировать, потому что мне не нужно разделить строку на отдельные символы. – Machtl

+0

Или создать a и b строки с нулевым завершением? На данный момент они не являются строками «С». Скажите, пожалуйста, это всего лишь какой-то причудливый эксперимент. – codah

ответ

0

Это Hacky, он может работать в вашем случае:

char* onlyDerived = new char[sizeof(Derived) - sizeof(Base) + 1];//+1 for '\0' 
memcpy(onlyDerived, &reinterpret_cast<const char*>(&derived) + sizeof(Base), sizeof(Derived) - sizeof(Base)); 
onlyDerived[sizeof(Derived) - sizeof(Base)] = '\0'; 

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

Вы можете сделать что-то наподобие: char* Base::serialize() const;.

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