Показать сообщение отдельно
Старый 28.06.2009, 03:55   #13
Genius
Знающий
 
Аватар для Genius
 
Регистрация: 02.11.2007
Сообщений: 255
Написано 27 полезных сообщений
(для 43 пользователей)
Ответ: Хитрая хитрость

Ёпть так надо было сразу с этого начинать...

Я бы так делал:

Мы уже имеем объекты:

представим что у нас в объекте есть массив так называемых Value,Value имеет 2 переменые 1) int,индификатор типа данных которые содержатся в Value и данные void*,

struct Value
{
    enum{
       INT=1,
       FLOAT,
       BOOL,
       STRING
    };
    char type;
    void* data;

    void setInt(int v)
    {
        type = INT;
        data = &v;
    }
    void setFloat(flaot v)
    {
        type = FLOAT;
        data = &v; 
    }
    void setBool(bool v)
    {
        type = BOOL;
        data= &v;
    }
    void setString(char* str)
    {
        type = STRING;
        data=str;
    }

    int toInt()
    {
       return *static_cast<int*>(data);
    }
    float toFloat()
    {
       return *static_cast<float*>(data);
    }
    bool toBool()
    {
       return *static_cast<bool*>(data);
    }
    char* toString()
    {
       return static_cast<char*>(data);
    }

    bool isINT()
    {
       return type == INT;
    }
    bool isFLOAT()
    {
       return type == FLOAT;
    }
    bool isBOOL()
    {
       return type == BOOL;
    }
    bool isSTRING()
    {
       return type == INT;
    }
};

struct Object
{
    char id; // индификатор 0-225
    std::vector<Value> values;
};


пишем в файл кол-во объжектов
for(int i=0;i<count_objects;i++)
{
     Object* obj = objects[i];
     пишем в файл char  - obj->id;
     пишем в файл int - obj->values.size(); - кол-во value'ев
     for(int k=0;k<obj->values.size();k++)
     {
          Value val = obj->values[k];
          пишем char val->type; - тип value
          switch(val->type)
          {
               case Value::INT:
               {
                   пишем int - val->getInt();
               }break;
               case Value::FLOAT:
               {
                   пишем float - val->getFloat();
               }break;
               case Value::BOOL:
               {
                   пишем bool - val->getBool();
               }break;
               case Value::STRING:
               {
                   пишем char* - val->getString();
               }break;
          }
     }

}
Загрузка аналагично записи.
Еесли будет не понятно могу и пример загрузки этого чуда написать..
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Mr_F_ (28.06.2009)