我想在我的項目中的一些自定義類中包裝TinyXML庫的一部分,因爲我只需要它的某些功能,我不想公開所有內容。類包裝設計問題
我有一個問題,我的XMLDocument::AddNode(...)
函數基本上和我的XMLNode
類所做的相同。我想知道是否有人可以給我一些關於如何包裝TinyXML庫的設計技巧,這樣我就不會破壞封裝,並且封裝類不會將TinyXML庫暴露給我的代碼的其餘部分。
class XMLNode
{
public:
XMLNode::XMLNode();
XMLNode::XMLNode(const std::string& element); // Creates a TiXMLElement object
XMLNode::XMLNode(XMLNode& nodycopy);
XMLNode::~XMLNode();
XMLNode GetFirstChild();
XMLNode GetNextSibling();
std::string GetNodeValue();
std::string GetNodeName();
void AddNodeText(const std::string& text);
void AddNodeAttribute();
private:
std::string value;
std::string nodename;
TiXmlElement* thisnode;
};
//These functions do the same as my AddNode does from XMLDocument, it seems rather silly...
XMLNode::XMLNode(const std::string& str_element)
{
thisnode = new TiXmlElement(str_element.c_str());
nodename = str_element;
}
void XMLNode::AddNodeText(const std::string& nodetext)
{
TiXmlText* text = new TiXmlText(nodetext.c_str());
thisnode->LinkEndChild(text);
value = nodetext;
}
class XMLDocument
{
public:
XMLDocument::XMLDocument(const std::string& documentname);
XMLDocument::~XMLDocument();
void SaveToFile(std::string filename);
std::string basicXML(std::string rootnode);
void AddNode(XMLNode& node);
XMLNode GetXPathNode(const std::string& node);
void AppendCloneNodeAsChild(XMLNode& nodetoappend);
void SetRoot(XMLNode& rootnode);
private:
TiXmlDocument document;
TiXmlElement root;
TiXmlElement currentelement;
};
void XMLDocument::AddNode(XMLNode& node) // This function does over what XMLNode class is actually for... I just want to add the node to the XMLDocument
{
std::string val = node.GetNodeName();
TiXmlElement* el = new TiXmlElement(val.c_str());
TiXmlText * txt = new TiXmlText(node.GetNodeValue().c_str());
el->LinkEndChild(txt);
document.LinkEndChild(el);
}
任何人都可以給我一些建議,關於如何正確包裝,只公開我想要的TinyXML的功能?
但是我的XMLNode與document.AddNode使用的TiXmlElement不兼容 – 2010-10-20 16:45:23
@Tony - 我看到了,但是由於'XmlNode'封裝了'TiXmlElement',你不能直接調用'document.AddNode(* node .thisnode);'? – 2010-10-20 16:50:24
所以你會暴露TiXmlElement?我想這裏沒有太多的選項,儘管我認爲它暴露了一種包裝的想法... – 2010-10-20 19:51:47