C ++ MSGPack -benutzerdefinierte Klassen - kann nicht gestartet werden
Frage
Ich habe mir die C ++-Schnellstart-Handbuch für MSGPack angesehen.
http://wiki.msgpack.org/pages/viewpage.action?pageId=1081387
Dort gibt es den folgenden Code -Snippet:
#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);
}
Ich möchte einen Vektor von Mycass -Objekten serialisieren.
Ich habe Folgendes ausprobiert:
...
vector<myclass> rb;
myclass mc;
...
int main(){
...
mc("hello","world");
rb.push_back(mc)
...
}
Dies funktioniert jedoch nicht ("Fehler: keine Übereinstimmung für Anruf")
Auch wenn ich:
mc.str1="hello"
mc.str2="world"
Es wird nicht funktionieren, da Str1 und Str2 privat sind.
Wie benutze ich dieses msgpack_define (...) -Makro richtig? Ich kann anscheinend online nichts finden.
Danke vielmals,
Lösung
MSGPACK_DEFINE(
) Definiert einige Methoden, die Packungen und Auspacken für Ihre Klasse implementieren. Was du hineingesteckt hast ()
ist eine Liste der Mitglieder, die Sie serialisieren möchten.
Danach können Sie Ihre Klasse so packen und auspacken, wie Sie es packen oder auspacken würden int
. Das Beispiel sollte also funktionieren.
Sie können versuchen, den Vektor zu entfernen und nur ein einzelnes Objekt zu packen - ich denke, das würde ihn vereinfachen.
Andere Tipps
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);
}