从第三方模块复制成员时编写复制构造函数的任何提示被拒绝?
Any tipps on writing a copy constructor when copying a member from a third party module is denied?
我目前正在编写一些代码来从 xml 文件中读取数据。为此,我使用了 pugixml 模块,它提供了 class xml_document
提供的方法来解析文件。
为了存储这些数据,我创建了一个 class tXmlDoc
来管理加载操作(比如设置路径、存储解析结果等等)。
我现在想在这个 tXmlDoc
中包含一个复制构造函数,但是,唉,我不能复制 pugi::xml_document
成员,因为 pugixml 显然明确地拒绝复制,据我了解这个模块的代码.
您对如何处理此问题有何建议?我不想为 pugixml 编写复制构造函数,因为我确信作者有充分的理由否认这一点,我不想 fiddle 那样。
顺便说一句,我对赋值运算符也有类似的问题。
因为 pugi 中似乎只实现了移动构造函数xml。
这是我当前的 tXmlDoc
header。
#pragma once
#include <iostream>
#include <string>
#include <array>
#include "../../libs/pugixml-1.11/src/pugixml.hpp"
#include "XmlData_General.h"
#include "XmlNodes.h"
namespace nXml
{
/**
* This class provides methods and helper functions to:
* - read an xml file identified by its file name including suffix and the path to this file
* - load the root node of the xml document
* - to manage basic information of the root node
*/
class tXmlDoc
{
public:
tXmlDoc();
tXmlDoc(tXmlDoc&); //copy constructor
~tXmlDoc();
tXmlDoc& operator=(const tXmlDoc&);
void LoadXmlFile(const std::string& file_name, std::string& file_path);
pugi::xml_node GetRootNode();
std::string GetFileName();
std::string GetFilePath();
std::string GetFullPath(const std::string& file_name, std::string& file_path);
void SetFileName(const std::string& file_name);
void SetFilePath(const std::string& file_path);
bool GetFileLoaded();
bool GetNodeCorrect();
int GetErrorCode();
int GetChildNumber();
pugi::xml_parse_result GetXmlResult();
void LoadData();
void CheckNode();
protected:
std::string file_path = ""; //is set when calling LoadXmlFile
std::string file_name = ""; //is set when calling LoadXmlFile
bool file_loaded = false; //provides information is file was successfully loaded (file correctly loaded: true). Modified by method LoadXmlFile
bool node_correct = false; //indicating of node structure on its child level is correct
int error_code = 0; //provides information about occuring errors (no error: 0). Modified by method LoadXmlFile
int n_childs = 0;
pugi::xml_node root_node = pugi::xml_node(); //contains the root node of the xml document. Filled when calling LoadData (via calling GetRootNode inside LoadData)
pugi::xml_parse_result xml_result; //contains information about parsing result. Filled by method LoadXmlFile
pugi::xml_document xml_doc; //contains the entire document
//make sNodeNames known
sXmlNodeNames sNodeNames;
}
;
};
是否可以手动复制:
我发现 this question 关于这个主题
xml_document copy;
copy.reset(doc);
如果您不想真正复制它,另一种选择是将 shared_ptr 保留为 xml-root 的 const 版本。
我目前正在编写一些代码来从 xml 文件中读取数据。为此,我使用了 pugixml 模块,它提供了 class xml_document
提供的方法来解析文件。
为了存储这些数据,我创建了一个 class tXmlDoc
来管理加载操作(比如设置路径、存储解析结果等等)。
我现在想在这个 tXmlDoc
中包含一个复制构造函数,但是,唉,我不能复制 pugi::xml_document
成员,因为 pugixml 显然明确地拒绝复制,据我了解这个模块的代码.
您对如何处理此问题有何建议?我不想为 pugixml 编写复制构造函数,因为我确信作者有充分的理由否认这一点,我不想 fiddle 那样。
顺便说一句,我对赋值运算符也有类似的问题。
因为 pugi 中似乎只实现了移动构造函数xml。
这是我当前的 tXmlDoc
header。
#pragma once
#include <iostream>
#include <string>
#include <array>
#include "../../libs/pugixml-1.11/src/pugixml.hpp"
#include "XmlData_General.h"
#include "XmlNodes.h"
namespace nXml
{
/**
* This class provides methods and helper functions to:
* - read an xml file identified by its file name including suffix and the path to this file
* - load the root node of the xml document
* - to manage basic information of the root node
*/
class tXmlDoc
{
public:
tXmlDoc();
tXmlDoc(tXmlDoc&); //copy constructor
~tXmlDoc();
tXmlDoc& operator=(const tXmlDoc&);
void LoadXmlFile(const std::string& file_name, std::string& file_path);
pugi::xml_node GetRootNode();
std::string GetFileName();
std::string GetFilePath();
std::string GetFullPath(const std::string& file_name, std::string& file_path);
void SetFileName(const std::string& file_name);
void SetFilePath(const std::string& file_path);
bool GetFileLoaded();
bool GetNodeCorrect();
int GetErrorCode();
int GetChildNumber();
pugi::xml_parse_result GetXmlResult();
void LoadData();
void CheckNode();
protected:
std::string file_path = ""; //is set when calling LoadXmlFile
std::string file_name = ""; //is set when calling LoadXmlFile
bool file_loaded = false; //provides information is file was successfully loaded (file correctly loaded: true). Modified by method LoadXmlFile
bool node_correct = false; //indicating of node structure on its child level is correct
int error_code = 0; //provides information about occuring errors (no error: 0). Modified by method LoadXmlFile
int n_childs = 0;
pugi::xml_node root_node = pugi::xml_node(); //contains the root node of the xml document. Filled when calling LoadData (via calling GetRootNode inside LoadData)
pugi::xml_parse_result xml_result; //contains information about parsing result. Filled by method LoadXmlFile
pugi::xml_document xml_doc; //contains the entire document
//make sNodeNames known
sXmlNodeNames sNodeNames;
}
;
};
是否可以手动复制:
我发现 this question 关于这个主题
xml_document copy;
copy.reset(doc);
如果您不想真正复制它,另一种选择是将 shared_ptr 保留为 xml-root 的 const 版本。