C++ TiXmlElement*'的吸气剂和塞特包装器;s
我正在重写一个项目,以便它使用getter和setter来引用tixmlement* 但是,我很快遇到了与调试模式相关的问题: 我的类标题中的Ecxerpt:C++ TiXmlElement*'的吸气剂和塞特包装器;s,c++,tinyxml,C++,Tinyxml,我正在重写一个项目,以便它使用getter和setter来引用tixmlement* 但是,我很快遇到了与调试模式相关的问题: 我的类标题中的Ecxerpt: TiXmlElement *_rootElement; TiXmlElement *_dialogsElement; TiXmlElement *_dialogElement; TiXmlDocument _document; void setDocument (TiXmlDocument doc) { this->_documen
TiXmlElement *_rootElement;
TiXmlElement *_dialogsElement;
TiXmlElement *_dialogElement;
TiXmlDocument _document;
void setDocument (TiXmlDocument doc) { this->_document = doc; }
void setRootElement (TiXmlElement * element) { this->_rootElement = element; }
void setDialogsElement (TiXmlElement * element) { this->_dialogsElement = element; }
TiXmlDocument getDocument () { return this->_document; }
TiXmlElement* getRootElement () { return this->_rootElement; }
TiXmlElement* getDialogsElement () { return this->_dialogsElement; }
摘自类构造函数:
DCXML::DCXML(const char *dialogMark,const char *dialogName,TiXmlDocument doc) {
...
this->setDocument(doc);
this->setRootElement(this->getDocument().FirstChildElement("dcxml"));
this->setDialogsElement(this->getRootElement()->FirstChildElement("dialogs"));
从实例化类中摘录:
TiXmlDocument doc(input.gettok(2,"\"").to_chr());
bool dcxmlFile = doc.LoadFile();
...
DCXML *dcxml = new DCXML(input.gettok(2).to_chr(),input.gettok(3).to_chr(),doc);
现在是奇怪的部分。直到
this->setDialogsElement(this->getRootElement()->FirstChildElement("dialogs"));
在构造函数中
->处于调试模式时,FirstChildElement(“对话框”)在VS2008中抛出“CXX0039:错误:符号不明确”错误
奇怪的是IntelliSense使用FirstChildElement方法,编译器不会抛出任何错误
更奇怪的是,在发布模式下,它只是默默地无法获取dialogs元素
我做错了什么?或者,如果您已经成功地为TiXmlElement*实现了getter setter包装器,那么也请告诉我如何实现它
以下是XML文件的摘录,以供完整参考:
<?xml version="1.0" encoding="utf-8"?>
<dcxml>
<dialogs>
<dialog
name="mediaplayer"
center=""
w="300"
h="400"
caption="Mamp 4.0 BETA"
border="btmnzy">
</dialog>
</dialogs>
</dcxml>
由于我正处于死胡同,我们将非常感谢您的反馈:)请确保
TiXmlDocument getDocument () { return this->_document; }
不会深度复制其包含的TiXmlElement。否则返回一个临时值,在构造函数中使用该值设置根节点,然后根节点将被销毁。我没有查看它的API,但要注意这些陷阱
调用不明确的原因是:
FirstChildElement
有三个重载,每个重载包含一个参数:
const TiXmlElement * FirstChildElement (const char *value) const // :1
const TiXmlElement * FirstChildElement (const std::string &_value) const // :2
TiXmlElement * FirstChildElement (const std::string &_value) // :3
您可以通过tixmlement&
(使用tixmlement*
指针)访问tixmlement。但是采用常量char*
的版本有一个隐式对象参数tixmlement const&
。也就是说,需要进行资格转换才能使调用正常工作。对于采用std::string const&
的其他版本,也需要进行转换:
<implied obj param> <implicit obj param> <arg1> <param1>
TiXmlElement& TiXmlElement const& char const* char const* // :1
TiXmlElement& TiXmlElement const& char const* std::string const& // :2
TiXmlElement& TiXmlElement& char const* std::string const& // :3
相反,它将调用最后一个版本。另一个修复方法是const_cast:
this->setDialogsElement(
const_cast<TiXmlElement const*>(this->getRootElement())->
FirstChildElement("dialogs"));
this->setDialogsElement(
const_cast(this->getRootElement())->
FirstChildElement(“对话框”);
这将调用第一个版本。至于为什么它只发生在调试中。。。我记得TiXML有一个禁用STL的选项。也许在发布模式下您禁用了它(因此重载采用了std::string
),但在调试模式下您忘记了吗
this->setDialogsElement(
const_cast<TiXmlElement const*>(this->getRootElement())->
FirstChildElement("dialogs"));