Выполнить копию документа объекта quickjson

Я делаю класс и хочу вернуть свой класс внутри метода. Мой класс имеет rapidjson::Document объект.

Вы можете увидеть предыдущие проблемы здесь: LNK2019: "Нерешенный внешний символ" с рапиджсоном

Как я обнаружил, quickjson мешает вам выполнить любую копию Document объект, а затем копия по умолчанию класса, содержащего Document объект не удался. Я пытаюсь определить свой собственный конструктор копирования, но мне нужно выполнить копию объекта. Я видел способ гипотетически скопировать объект с .Accept() метод, но возвращает мне много ошибок внутри rapidjson::Document учебный класс:

ошибка C2248: «не удается получить доступ к закрытому члену, объявленному в классе« rapidjson :: GenericDocument »

Это мой конструктор копирования:

jsonObj::jsonObj(jsonObj& other)
{
jsonStr = other.jsonStr;
message = other.message;

//doc = other.doc;
doc.Accept(other.doc);

validMsg = other.validMsg;
}

я нашел в коде библиотеки (строка 52-54), что «Copy constructor is not permitted».

Это мой класс:

class jsonObj {
string jsonStr;
Document doc;

public:
jsonObj(string json);
jsonObj(jsonObj& other);

string getJsonStr();
};

Метод:

jsonObj testOBJ()
{
string json = "{error:null, message:None, errorMessage:MoreNone}";
jsonObj b(json);
return b; //It fails here if I return a nested class with a rapidjson::Document in it. Returning NULL works
}

Так как выполнить копию Document элемент?

4

Решение

вместилище https://github.com/rjeczalik/rapidjson
иметь Патч DeepCopy что может помочь вам скопировать один документ в другой.

1

Другие решения

Используйте метод CopyFrom в новом документе:

rapidjson::Document inDoc;    // source document
rapidjson::Document outDoc;   // destination document
outDoc.CopyFrom(inDoc, outDoc.GetAllocator());

я проверил этот подход и изменения, внесенные в выходной документ, не оказали влияния на входной документ. Убедитесь, что для метода CopyFrom задан распределитель выходного документа.

8

Я создал этот метод для копирования объекта документа, и он прекрасно работает для меня:

static void copyDocument(rapidjson::Document & newDocument, rapidjson::Document & copiedDocument) {
rapidjson::StringBuffer strbuf;
rapidjson::Writer<rapidjson::StringBuffer> writer(strbuf);
newDocument.Accept(writer);
std::string str = strbuf.GetString();
copiedDocument.Parse<0>(str.c_str());
}
0

необходимо использовать (const) ссылку в качестве возвращаемого типа (попытаться сохранить новые документы в классе создателя), вы не можете копировать документы, т.е. не можете возвращать по значению, поскольку неявно вы пытаетесь использовать отключенный конструктор копирования

0
По вопросам рекламы [email protected]