gpt4 book ai didi

c++ - 类包装设计问题

转载 作者:行者123 更新时间:2023-11-28 08:26:15 24 4
gpt4 key购买 nike

我想将 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 的功能?

最佳答案

您已经封装了 TinyXml 文档 - 现在您只需要在您想要的地方委托(delegate)给它,只公开它提供的功能的一个子集。

替换这个

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);
}

有了这个

void XMLDocument::AddNode(XMLNode& node) 
{
document.AddNode(node);
}

这是完全合法的,因为您不想将完整的 TiXmlDocument 暴露给您类(class)的客户。想想如何std::queuestd::stack充当底层容器的适配器。

关于c++ - 类包装设计问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3979956/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com