Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 执行rapidjson文档对象的副本_C++_Visual C++_Visual Studio 2012_Rapidjson - Fatal编程技术网

C++ 执行rapidjson文档对象的副本

C++ 执行rapidjson文档对象的副本,c++,visual-c++,visual-studio-2012,rapidjson,C++,Visual C++,Visual Studio 2012,Rapidjson,我正在创建一个类,我想在一个方法中返回我的类。我的类有一个rapidjson::Document对象 您可以在此处看到前面的问题: 正如我发现的,rapidjson阻止您执行文档对象的任何类型的复制,然后包含文档对象的类的默认副本失败。我试图定义自己的复制构造函数,但我需要执行对象的复制。假设使用.Accept()方法复制对象,但在rapidjson::Document类中返回了大量错误: 错误C2248:'无法访问类'rapidjson::GenericDocument'中声明的私有成员' 这

我正在创建一个类,我想在一个方法中返回我的类。我的类有一个
rapidjson::Document
对象

您可以在此处看到前面的问题:

正如我发现的,rapidjson阻止您执行
文档
对象的任何类型的复制,然后包含
文档
对象的类的默认副本失败。我试图定义自己的复制构造函数,但我需要执行对象的复制。假设使用
.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行)“不允许复制构造函数”

这是我的班级:

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
}
那么如何执行
文档
元素的副本呢?

存储库
有可能帮助您将一个文档复制到另一个文档的方法。

我创建了此方法来复制文档对象,它对我来说很好:

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());
}
静态无效复制文档(rapidjson::Document&newDocument,rapidjson::Document&copiedDocument){
rapidjson::StringBuffer strbuf;
rapidjson::编剧-编剧(strbuf);
newDocument.Accept(writer);
std::string str=strbuf.GetString();
copiedDocument.Parse(str.c_str());
}

在新文档上使用CopyFrom方法:

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

I和对输出文档所做的更改对输入文档没有影响。确保CopyFrom方法是由输出文档的分配器提供的。

必须使用(const)引用作为返回类型(尝试将新文档存储在creator类中),您不能复制文档,即不能按值返回,因为您会隐式地尝试使用禁用的复制构造函数

在,在我看来,您需要重新思考如何编写
jsonObj
类。如果要实际复制rapidJson文档,则需要分配一个新文档,然后将旧文档显式复制到新文档,从而生成两个具有相同数据的不同文档。因此,您需要为
jsonObj
创建一个副本构造函数、赋值等。您可能需要重新考虑您的体系结构和rapidJson的使用。@RichardChambers我已经有了一个复制和分配构造函数,但是我知道如何复制
文档
对象而不必每次解析json字符串。我需要一个包含RAPIDJSON库的类,因为我正在制作一个C++库,我需要用包装器来公开JSON解析器,所以我需要在一个方法中返回我的类,其中的方法是<代码>文档<代码>。我认为复制document对象的唯一方法是进行解析,否则您会遇到深层复制与浅层复制(指针重复)以及谁拥有什么内存分配问题。rapidJson似乎是为任何特定文档的单个实例而设计的,因此您的包装器将需要使用移动语义而不是复制语义。在我看来,你似乎在试图反对rapidJson的架构和设计,这就是为什么我建议你重新思考你的架构或寻找rapidJson的替代方案。在阅读了前面的问题和这个问题后,我开始认为@RichardChambers的评论是正确的。另一方面,我又在思考另一件事与其在嵌套的
类中使用文档
在没有
文档
成员的情况下创建文档并在作用域时创建它,也许这将允许另一个
文档实例
?对于那些感兴趣的人,
文档
现在支持C++11移动语义(从提交
1950EFD6760FC89A074AE5B989E560EDD92578开始),非常感谢你的好意。但是,它不会帮助OP为包含按值的文档的对象实现复制构造函数。谢谢,但在尝试执行复制时,补丁对我不起作用(第447行上的错误:
doc.Accept(other.doc))是否需要创建一个测试用例(例如,在gist.github.com或pastebin中)?在
IsString
问题中提到的另一个补丁是另一个问题。你的解决方案有效;谢谢。解析并不快。它也适用于非文档类型,只要对象可以转换为值<代码>值v=。。。;CopyFrom(v,outDoc.GetAllocator())