Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > сериализация


Автор: knut 11.3.2007, 16:46
Добрый день Всем.
Вот столкнулся с проблемой сериализацией. 
Есть два класса cA и cB.У cA есть два метод some_method_1() и some_method_2() 
в методе some_method_1() создается обект cB a в метод some_method_2() надо пеедать обект
созданный в методе some_method_1(). 
Код



class cB
{}; 
class cA
{
public:
void some_method_1() ;
void some_method_2() ;

};
void cA::some_method_1() 
{
cB *pObj = new cB;
//do with object pObject something.
}

Собственно вопрос. как сериализоварь обект pObj ?.
или может можно обойти сериализацию и зделать как то подругому?A
P.S без boos a 

Автор: Xenon 11.3.2007, 17:33
По-моему если класс состоит только из POD элементов, то можно просто бинарно писать:
Код

std::fstream file("...",std::ios::out | std::ios::binary);
file.write(reinterpret_cast<char*>(pObj),sizeof(cB));

Автор: knut 11.3.2007, 17:38
Xenon, не понял куда бинарно писать? нме только надо передат в метод void some_method_2() ; обект зоданный в методе void some_method_1() ;

Автор: Fazil6 11.3.2007, 17:43
Цитата(knut @  11.3.2007,  15:46 Найти цитируемый пост)
Собственно вопрос. как сериализоварь обект pObj ?.

сериализация - это по твоему что?

Автор: Xenon 11.3.2007, 17:44
knut, Я так понял под сериализацией ты имеешь ввиду запись в файл.
Тогда какие проблемы?.. Передавай указатель.
Код

class cB
{}; 
class cA
{
public:
void some_method_1();
void some_method_2(cB* obj) ;

};
void cA::some_method_1() 
{
    cB *pObj = new cB;
    some_method_2(pObj);
}
void cA::some_method_2(cB* obj)
{
    delete obj;
}

Или я чего-то не понимаю в вопросе

Автор: knut 11.3.2007, 17:47
Цитата

сериализация - это по твоему что? 

соxронить обект.

Автор: Xenon 11.3.2007, 17:50
knut, передать объект по указателю/ссылке/значению равно, в твоем случае, сериализации(сохранению)? Э?

Автор: knut 11.3.2007, 18:26
Xenon,  в твое примере в методе some_method_2(cB* obj)  я не получу тот же обект которы был создан в some_method_1(). 

 
Код

class cB
{}; 
class cA
{
public:
void some_method_1();
void some_method_2(cB* obj) ;

};
void cA::some_method_1() 
{
    cB *pObj = new cB;
    some_method_2(pObj);
}
void cA::some_method_2(cB* obj)
{
    delete obj;
}


Добавлено @ 18:36 
в методе  some_method_1() соьдается и инизализуется обект *pObj  так вот в метод  some_method_2() надо передать уже этот инизализированный обект *pObj . 

Автор: vinter 11.3.2007, 18:38
Код

cB * cA::some_method_1() 
{
    cB *pObj = new cB;
    some_method_2(pObj);
    return pObj 
}
void cA::some_method_2(cB* obj)
{
    delete obj;

}
...........
cA obj;
obj.some_method_2(obj.some_method_1());

Автор: likehood 11.3.2007, 18:54
vinter, только ты забыл закоментить вызов второго метода в теле some_method_1, иначе some_method_1 будет возвращать уже удаленный объект.

knut, а чем тебе не нравиться вариант, предложенный Xenon'ом? Почему ты решил, что в some_method_2 не передается тот же объект, что был создан в some_method_1? И почему ты решил, что тебе нужна сериализация (кстати, что ты под ней понимаешь?)

Автор: knut 11.3.2007, 18:56
vinter, 
так не прокатет в смысле в some_method_2(cB* obj) надо передать полно инизализированный обект  pObj 
(т.е some_method_1() вызовается не зависимао от вызова some_method_2(cB* obj),иx вызовы не как не должны быть связонны.) выполняется some_method_1() инизализует pObj .вот когда уже вузовается some_method_2(cB* obj) ему уже 
должно быть переданно иницалисованный  *pObj ;
P.S some_method_1() и some_method_2(cB* obj) они как load и save.

Добавлено @ 19:00 
Цитата

knut, а чем тебе не нравиться вариант, предложенный Xenon'ом? Почему ты решил, что в some_method_2 не передается тот же объект, что был создан в some_method_1

см пост 11

Автор: Xenon 11.3.2007, 19:20
knut, Сделай pObj переменной-членом класса cA
Код

class cB
{}; 
class cA
{
private:
    cB* pObj;
public:
    void some_method_1();
    void some_method_2();
    cA():pObj(NULL){}

};
void cA::some_method_1() 
{
    pObj = new cB;
}
void cA::some_method_2()
{
    if (pObj) /*...Делаем что-нибудь..*/;
    else pObj = new cB;
}

Автор: Dark Elf 11.3.2007, 19:29
http://boost.org/libs/serialization/doc/index.html

Автор: Xenon 11.3.2007, 19:30
Dark Elf, 
Цитата(knut @  11.3.2007,  16:46 Найти цитируемый пост)
P.S без boos a 

При чем в итоге непонятно чего хочет человек smile

Автор: Любитель 11.3.2007, 19:32
Только пофиксить это надо. От многоразового вызова some_method_1 - утечка памяти пойдёт (просто проверку поставить).

Автор: Xenon 11.3.2007, 19:35
Любитель, ну да smile

Код

class cB
{}; 
class cA
{
private:
    cB* pObj;
public:
    void some_method_1();
    void some_method_2();
    cA():pObj(NULL){}

};
void cA::some_method_1() 
{
    if (!pObj) pObj = new cB;
}
void cA::some_method_2()
{
    if (pObj) /*...Делаем что-нибудь..*/;
    else pObj = new cB;

}

Автор: vinter 11.3.2007, 19:41
Код

cB * cA::some_method_1() 
{
    cB *pObj = new cB;
    return pObj 
}
void cA::some_method_2(cB* obj)
{
    delete obj;

}
...........
cA obj;
cB *objB = obj.some_method_1()
..............................
obj.some_method_2(objB);

Автор: knut 11.3.2007, 20:12
Сделал я так (наxимичил)
Код

class cB
{}; 
class cA
{
private:
    cB* pObj;
public:
    void some_method_1();
    void some_method_2();
    Get_Object(){return  pObj;}
    cA(){cA *pObj = new cA;}
};
void cA::some_method_1() 
{
    pObj = new cB;
}
void cA::some_method_2(cB*object)
{
   object = Get_Object();  
}

как такой вариант?

Добавлено @ 20:14 
только без этого[quote]
Код

void cA::some_method_1() 
{
    //pObj = new cB;// здесь не кокого new
}


Автор: vinter 11.3.2007, 20:16
как тебе такой вариант smile 
Код

void cA::some_method_2(cB &*object)
{
   object = pObj;  

}


Добавлено @ 20:18 
твой код работать не будет, у тебя типы разные
Код

cA *pObj = new cA;

и
Код

cB*object

Автор: Fazil6 11.3.2007, 20:49
Цитата

как такой вариант?

плохо все. 
Куча непонятно чего непонятно зачем. Такое впечатление, что ты сам плохо представляешь чего хочешь добиться

Автор: Xenon 11.3.2007, 21:16
knut, ты объясни лаконично то, чего ты хочешь в результате получить. Мы не кусаемся - поможем. Просто до меня так до сих пор д оконца и не дошло чего ты хочешь. Ты опиши проблему абстрактно

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)