Я делаю класс и хочу вернуть свой класс внутри метода. Мой класс имеет 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
элемент?
вместилище https://github.com/rjeczalik/rapidjson
иметь Патч DeepCopy что может помочь вам скопировать один документ в другой.
Используйте метод CopyFrom в новом документе:
rapidjson::Document inDoc; // source document
rapidjson::Document outDoc; // destination document
outDoc.CopyFrom(inDoc, outDoc.GetAllocator());
я проверил этот подход и изменения, внесенные в выходной документ, не оказали влияния на входной документ. Убедитесь, что для метода CopyFrom задан распределитель выходного документа.
Я создал этот метод для копирования объекта документа, и он прекрасно работает для меня:
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());
}
необходимо использовать (const) ссылку в качестве возвращаемого типа (попытаться сохранить новые документы в классе создателя), вы не можете копировать документы, т.е. не можете возвращать по значению, поскольку неявно вы пытаетесь использовать отключенный конструктор копирования