7

我正在上课,我想在一个方法中返回我的课程。我的班级有一个rapidjson::Document对象。

你可以在这里看到之前的问题:LNK2019: "Unresolved external symbol" with rapidjson

正如我发现的那样,rapidjson 会阻止您执行任何类型的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

4 回答 4

15

在新文档上使用 CopyFrom 方法:

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

测试了这种方法,对输出文档所做的更改对输入文档没有影响。确保为 CopyFrom 方法提供了输出文档的分配器。

于 2015-12-15T21:57:06.067 回答
1

存储库https://github.com/rjeczalik/rapidjsonDeepCopy 补丁,可以帮助您将一个文档复制到另一个文档中。

于 2014-03-30T15:51:31.687 回答
0

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

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());
}
于 2014-04-11T09:51:38.610 回答
0

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

于 2018-12-02T08:40:22.380 回答