Clases definidas por el usuario de C ++ Msgpack: no se puede comenzar
Pregunta
He estado mirando la guía de arranque rápido C ++ para msgpack.
http://wiki.msgpack.org/pages/viewpage.action?pageID=1081387
Ahí, está el siguiente fragmento de código:
#include <msgpack.hpp>
#include <vector>
#include <string>
class myclass {
private:
std::string str1;
std::string str2;
public:
MSGPACK_DEFINE(str1,str2);
};
int main(void) {
std::vector<myclass> vec;
// add some elements into vec...
/////
/* But what goes here??? */
/////
// you can serialize myclass directly
msgpack::sbuffer sbuf;
msgpack::pack(sbuf, vec);
msgpack::unpacked msg;
msgpack::unpack(&msg, sbuf.data(), sbuf.size());
msgpack::object obj = msg.get();
// you can convert object to myclass directly
std::vector<myclass> rvec;
obj.convert(&rvec);
}
Quiero serializar un vector de objetos myClass.
He probado lo siguiente:
...
vector<myclass> rb;
myclass mc;
...
int main(){
...
mc("hello","world");
rb.push_back(mc)
...
}
Pero esto no funciona ("Error: sin coincidencia para la llamada")
Además, si lo hago:
mc.str1="hello"
mc.str2="world"
No funcionará como STR1 y STR2 son privados.
¿Cómo usar esta macro msgpack_define (...) correctamente? Parece que no puedo encontrar nada en línea.
Muchas gracias,
Solución
MSGPACK_DEFINE(
) Define algunos métodos implementando el embalaje y el desempaquetado para su clase. Lo que pones dentro ()
es una lista de los miembros que desea serializado.
Después de eso, puede empacar y desempaquetar su clase como lo haría o desempacar un int
. Entonces el ejemplo debería estar funcionando.
Puede intentar eliminar el vector y empacar solo un objeto; creo que eso lo simplificaría.
Otros consejos
class myclass {
private:
std::string str1;
std::string str2;
public:
myclass(){};
myclass(string s1,string s2):str1(s1),str2(s2){};
MSGPACK_DEFINE(str1,str2);
};
int main(int argc, char **argv)
{
std::vector<myclass> vec;
myclass m1("m1","m2");
vec.push_back(m1);
// you can serialize myclass directly
msgpack::sbuffer sbuf;
msgpack::pack(sbuf, vec);
msgpack::unpacked msg;
msgpack::unpack(&msg, sbuf.data(), sbuf.size());
msgpack::object obj = msg.get();
// you can convert object to myclass directly
std::vector<myclass> rvec;
obj.convert(&rvec);
}